将xml内容转换为C#中的键值对

时间:2016-05-26 05:23:08

标签: c# xml deserialization

有没有办法在不迭代每个节点和元素的情况下以更简单的方式将xml转换为键值对

我的XML结构与此类似

<root>  
  <StandardValues>    
    <ButtonYES alias="customname value">Ja</ButtonYES>
    <ButtonNO>Nei</ButtonNO>
  </StandardValues>
  <Page1>
    <Key_Head>2011 Applications</Key_Head>
    <Key_Title>Title from 2011</Key_Title>
    <Key_Param1>Parameter value</Key_Param1>
  </Page1>
   <Page2>
    <Page_Head>2011 Applications</Page_Head>
    <page_Title>Title from 2011</page_Title>
    <CustomParam1>Parameter value</CustomParam1>
  </Page2>
</root> 

很明显,ElementNode名称和子xml节点名称本质上不一致,它可以是任何名称[xml标签[并且它可以是任意数量的子项目

XML转换的想法是为最终对象为Dic的应用程序启用转换

从XML转换为键值对列表

的最佳方法是什么?

我试过这个

         var maping = doc.Descendants("Page1")
              .Elements()
              .ToDictionary(d => (string)d.Name.LocalName,
                            d => (string)d.Value);

但是它只返回一个页面1我们可以为所有孩子的根目录

使用这种方法,我可以将它读取到具有3个属性的类

  var maping = doc.Descendants("Page1")
              .Elements().Select(d => new
                      {
                          Attribute = (string)d.Name.LocalName,
                          Value = d.Value, // equal to id you are searching for
                          Key = (d.Attribute("alias") != null) ? d.Attribute("alias").Value : ""
                      }).ToList();

        foreach (var s in maping)
        {
            string ss = string.Format("{0} -  {1} && {2}", s.Key, s.Value, s.Attribute);
        }

2 个答案:

答案 0 :(得分:2)

不确定你是否已经尝试过这个,

var doc = XDocument.Load(yourXML);
var maping = doc.Root.Elements()
                   .ToDictionary(a => (string)a.Attribute("key"),
                                 a => (string)a.Attribute("replaceWith"));

还有其他方法,我发现这更快。

答案 1 :(得分:2)

递归LINQ查询将帮助您形成层次结构,

public class AwesomeXml
{
    public static void Main()
    {
        string xml = @"<root>  
                    <StandardValues>    
                    <ButtonYES>Ja</ButtonYES>
                    <ButtonNO>Nei</ButtonNO>
                    </StandardValues>
                    <Page1>
                    <Key_Head>2011 Applications</Key_Head>
                    <Key_Title>Title from 2011</Key_Title>
                    <Key_Param1>Parameter value</Key_Param1>
                    </Page1>
                    <Page2>
                    <Page_Head>2011 Applications</Page_Head>
                    <page_Title>Title from 2011</page_Title>
                    <CustomParam1>Parameter value</CustomParam1>
                    </Page2>
                    </root>";       

        var doc = XDocument.Parse(xml);
        var result = ConvertXmlToDic(doc.Root);
        Console.Read();
    }

    private static object ConvertXmlToDic(XElement element)
    {            
        var result = element.Elements().
            Select(
                e => new { Key = e.Name,
                           Value = (e.Descendants().Count() == 0) ? e.Value : ConvertXmlToDic(e)
                }
            ).ToDictionary(e => e.Key, e => e.Value);
        return result;
    }        
}