【问题标题】:How do I read all XML nodes of a specific name and put them into an array (or list)?如何读取特定名称的所有 XML 节点并将它们放入数组(或列表)中?
【发布时间】:2012-11-08 00:37:28
【问题描述】:

我有一个 XML:

<?xml version="1.0" encoding="UTF-8"?>
<ticket>
    <comments type="array">
         <comment> 
               <attachments type="array">
                     <attachment>
                          <url>I NEED WHATEVER IS IN HERE</url>
                     </attachment>
               </attachments>
         </comment>
         <comment>
               <attachments type="array">
                     <attachment>
                          <url>I NEED WHATEVER IS IN HERE</url>
                     </attachment>
               </attachments>
         <comment>
     </comments>
</ticket>

我将如何获取 URL 标记内的任何内容并将其添加到 &lt;List&gt;?我正在使用 C#。

【问题讨论】:

  • 您接收 Xml 的格式是什么?文件、XDocument、XmlDocument 等?
  • var doc = new XmlDocument(); doc.LoadXml(client.DownloadString(url));

标签: c# .net xml linq xpath


【解决方案1】:

用途:

var result = XDocument.Parse(inputXml)
    .DescendantNodes().OfType<XText>().Select(e => e.Value).ToList();

或者使用 XPath:

var result = ((IEnumerable)XDocument.Parse(input).XPathEvaluate("//text()"))
    .Cast<XText>().ToList();

要仅从 url 元素中检索文本,请使用:

var result = XDocument.Parse(inputXml)
        .Descendants("url").Select(e => e.Value).ToList();

或在 XPath 之上更改://url/text()

【讨论】:

  • 我想更好的方法是只选择 url 节点的内部文本,以防万一其他类型的文本节点插入到该 XML 中。
  • @ThomasC.G.deVilhena,这取决于任务。 OP的问题尚不清楚。无论如何,修改提供的查询很容易。
  • var 结果 = XDocument.Parse(inputXml) .Descendants("url").Select(e => e.Value).ToList();正是我想要的。我
【解决方案2】:
using (StringReader sr = new StringReader(xml_content))
{
    XDocument xdoc = XDocument.Load(sr);

    IList<string> values = xdoc.XPathSelectElements("ticket/comments/attachments/url").Select(e => e.Value).ToList();
}

或者,根据您评论中的用例:

var doc = new XmlDocument();
doc.LoadXml(xml_content);
IList<string> values = doc.SelectNodes("ticket/comments/attachments/url")
    .Cast<XmlElement>().Select(e => e.InnerText).ToList();

【讨论】:

    【解决方案3】:

    或者你可以使用 var values = xdoc.SelectSingleNode("ticket/cmets/attachments/url").InnerXml;

    【讨论】:

      猜你喜欢
      • 2017-02-19
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      相关资源
      最近更新 更多