c#如何将xml转换为字典以获取一个属性和多个元素的值

时间:2013-07-09 07:53:13

标签: c# xml dictionary

我需要将xml转换为字典。我以前从未这样做过。你能告诉我一个代码示例如何将这个xml转换为字典来获取这样的值:

Key: Vendor and Value: BankRed
Key: CustRef and Value: dfas16549464
Key: InvP and Value: 1, 12

这是xml:

<root>
    <Vendor name = "BankRed">
       <CustRef>dfas16549464</CustRef>
       <InvP> 1, 12</InvP>
    </Vendor>
</root>

我们将不胜感激。非常感谢!

3 个答案:

答案 0 :(得分:1)

我认为您可以做一些澄清,但这可以达到预期的效果,假设供应商属性名称应该是供应商部分的密钥,尽管您还不清楚

XDocument xml = XDocument.Load("path to your xml file");

var dict = xml.Descendants("Vendors")
              .Elements()
              .ToDictionary(r => r.Attribute("name").Value, r => r.Value);

假设有一个XML结构:

<root>
   <Vendors>
       <Vendor name="BankRed">
           <CustRef>dfas16549464</CustRef>
           <InvP> 1, 12</InvP>
       </Vendor>
   </Vendors>
   <Vendors>
       <Vendor name="BankBlue">
           <CustRef>foo</CustRef>
           <InvP>bar</InvP>
       </Vendor>
   </Vendors>
</root>

您将获得一个Dictionary<string, string>,其中包含两个如下所示的元素: -

  • :BankRed
  • :dfas16549464 1,12
  • :BankBlue
  • :foo bar

但是,我认为你采取了错误的做法。更好的想法是创建一个自定义类型Vendor来存储此信息,例如:

public class Vendor
{
    public Vendor()
    { }

    public string CustRef { get; set; }
    public string VendorName { get; set; }
    public string InvP { get; set; }
}

查询将变为:

var query = (from n in xml.Descendants("Vendors")
          select new Vendor()
          {
               VendorName = n.Element("Vendor").Attribute("name").Value,
               CustRef = n.Descendants("Vendor").Select(x => x.Element("CustRef").Value).SingleOrDefault(),
               InvP = n.Descendants("Vendor").Select(x => x.Element("InvP").Value).SingleOrDefault()
          }).ToList();

这将为您提供如下所示的Vendor列表:

enter image description here

现在数据更容易使用。

答案 1 :(得分:0)

我写了一段代码并对其进行了测试。我希望这就是你所需要的,尽管你的问题并不清楚你为什么需要它: 使用字典的类Entity:

公共类实体    {       私有字符串CustRef;       私有字符串InvP;

  public Entity(string custRef, string invP)
  {
     CustRef = custRef;
     InvP = invP;
  }
}

和转换代码:

     Dictionary<string, Entity> myTbl = new Dictionary<string, Entity>();
     XmlDocument doc = new XmlDocument();
     doc.Load(@"d:\meXml.xml");
     XmlNode root = doc.FirstChild;
     foreach (XmlNode childNode in root.ChildNodes)
     {
        myTbl[childNode.Attributes[0].Value] = new Entity(
           childNode.FirstChild.InnerText, 
           childNode.LastChild.InnerText);
     }

答案 2 :(得分:-3)

尝试使用以下代码:

Dictionary<int, string> elements = xml.Elements(ns + "root")
        .Select(sp => new { 
                              CustRef = (string)(sp.Attribute("CustRef")), 
                              vendor = (string)(sp.Attribute("Vendor")) 
                          })
        .ToDictionary(sp => sp.CustRef, sp => sp.Vendor);