【问题标题】:How to read XML String into List or any collection如何将 XML 字符串读入 List 或任何集合
【发布时间】:2013-02-01 13:11:39
【问题描述】:

我有类似于

的字符串
xmlDataEntAddAttr = @"<ADDITIONAL INFO>
                            <Host> Test Host Name </Host>
                            <IP Address>Test IP Address</IP Address>
                            <Domain>Test Domain</Domain>
                            <Host Method>Test Host Method</Host Method>
                            <Flag>Test Flag</Flag>
                      </ADDITIONAL INFO>";

如何将其读入一个字符串列表,其中包含标签名称和值,或者在任何集合中。 请不要像&lt;Host&gt;&lt;/Host&gt; 这样的内部标签可以是任何值,只有常量这里是根表示&lt;ADDITIONAL INFO&gt;&lt;/ADDITIONAL INFO&gt;

请提出任何解析方法。

【问题讨论】:

  • 字符串列表是什么意思?你想让你的列表包含 5 个元素,每个元素都有 5 个标签的值吗?还是您也想要标签本身?具体来说,我想知道您是否想要 &lt;Host&gt; Test Host Name &lt;/Host&gt;Test Host Name 在您的列表中
  • @psubsee2003 我想要标签名称&lt;Host&gt;&lt;/Host&gt; 和标签值Test Host Name 在列表或任何集合中

标签: c# xml linq collections


【解决方案1】:

使用XDocument(在System.Xml.Linq 命名空间中)和Linq to Xml。

XDocument xDocument = XDocument.Parse(xmlDataEntAddAttr);
Dictionary<string, string> result = xDocument.Root.Elements().ToDictionary(element => element.Name.LocalName, element => element.Value);

但是,您的字符串不是有效的 XML。 XML 元素名称中不能有空格。您的字符串的有效版本是:

xmlDataEntAddAttr = @"<ADDITIONAL_INFO>
                            <Host> Test Host Name </Host>
                            <IP_Address>Test IP Address</IP_Address>
                            <Domain>Test Domain</Domain>
                            <Host_Method>Test Host Method</Host_Method>
                            <Flag>Test Flag</Flag>
                      </ADDITIONAL_INFO>";

【讨论】:

  • 非常感谢,这正是我所需要的,但是是否可以通过任何调整来读取带有空格的 XML 元素,因为 XML 字符串中的数据很难更改。跨度>
  • @Pratik 如果元素名称中有空格,则不称为 XML,因为它不符合 XML 规范。因此,除非您想创建自己的损坏的 XML 解析器,否则我建议您修复 XML 源代码。
  • 感谢 cmets Cedric 创建一个糟糕的解析器将是一个糟糕的选择。将实现 XML 元素本身的更改。非常感谢您的帮助
  • 这怎么叫你用来传递参数的? => 链式语法或类似的东西?我说它应该替换 foreach 循环是对的吗?
  • 这称为 lambda 表达式。而且,确实在这种情况下,它替换了一个 foreach 循环:for (var element in xDocument.Root.Elements) dictionary.Add(element.Name.LocalName, element.Value)
【解决方案2】:

如果我的 xml 结构如下:

<nodes>
    <node id="123">
        <text>text goes here</text>
    </node>
</nodes>

那么我可以这样做:

XDocument xDoc;
using(StringReader sr = new StringReader("thexml"))
{
    xDoc = XDocument.Load(sr);
}
myDictionary = xDoc.Descendants("node").ToDictionary(x => x.Attribute("id").Value, x =>         x.Descendants("text").First().Value);

【讨论】:

  • 感谢您的帮助 Will,但我的解决方案更接近 Cedric 的回答。谢谢
【解决方案3】:

注意,附加信息、IP 地址和主机方法中的空格需要去掉

        var xmlDataEntAddAttr = @"<?xml version=""1.0""?>
                        <ADDITIONALINFO>
                        <Host> Test Host Name </Host>
                        <IPAddress>Test IP Address</IPAddress>
                        <Domain>Test Domain</Domain>
                        <HostMethod>Test Host Method</HostMethod>
                        <Flag>Test Flag</Flag>
                  </ADDITIONALINFO>";
        var xDocument = XDocument.Parse(xmlDataEntAddAttr);
        if (xDocument.Root != null)
        {
            var coll = xDocument.Root.Elements().Select(x => new {Name = x.Name, Value = x.Value});
            foreach (var item in coll)
            {
              Console.WriteLine("Name: {0}\tValue: {1}", item.Name, item.Value);
            }
        }
        Console.ReadLine();

【讨论】:

  • 感谢TYY的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
相关资源
最近更新 更多