【问题标题】:Convert xml contents to a key value pair in C#在 C# 中将 xml 内容转换为键值对
【发布时间】:2016-05-26 05:23:08
【问题描述】:

有什么方法可以更简单地将 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);
        }

【问题讨论】:

  • 你试过 LINQ to XML 吗?
  • 我认为如果它的 LINQtoXML 我们应该根据 XML 结构保留多个类,我们不能将其作为键值对,在这种情况下,我必须使用属性创建 3 个类 SatndardValues Page1 和 Page2类似于子节点。
  • 您是否正在寻找这个特殊的xml 或任何(通用)xml?
  • 可以是通用的 xml 。可以包含 N 个节点,每个节点可以包含 X 个元素
  • 一个键值对是什么?什么是关键,什么是价值?如果是元素名称和值,你建议如何处理重复和嵌套元素?

标签: c# xml deserialization


【解决方案1】:

不确定您是否已经尝试过,

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

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

【讨论】:

  • 这个“key”和“replaceWith”应该是什么?因为当我尝试对 xml 进行尝试时,我得到了 null 异常
  • 请查看对问题的编辑,我以某种方式使其适用于一组 xml 节点。任何使它适用于整个 xml 的方法
【解决方案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;
    }        
}

【讨论】:

  • 看起来更好更干净的方法。现在我计划将 XML 作为一个整体转换为具有 3 个属性键值和一个用于检索属性值的参数的类有一个属性的机会]
  • 请在我的回答中查看我将其转换为类的方式编辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多