【问题标题】:select all xml child nodes that start with a string or another string选择所有以字符串或其他字符串开头的 xml 子节点
【发布时间】:2014-08-02 21:04:42
【问题描述】:

我正在使用 C#。

我从外部客户端获得了一个带有子节点的 xml 节点,如下所示:

<PriceID>32</PriceID>
<Store_1> 344</Store_1>
      <Store_32> 343 </Store_32>
       <SS> 54</SS>

我想选择所有以 Store & SS

开头的节点

有什么办法可以做到吗?

我知道有一种方法可以选择以 Store 开头的节点:

   list = el.SelectNodes(@"node()[starts-with(name(), 'Store')]");

我想选择所有以 "Store" & "SS" 开头的节点。

请告诉我。

【问题讨论】:

  • 使用XmlDocument吗?您可以改用 LINQ to XML 吗?我个人觉得更简单...var results = doc.Descendants().Where(x =&gt; x.Name.LocalName.StartsWith("Store") || x.Name.LocalName.StartsWith("SS"));
  • 我更喜欢使用 xmldocument,因为我们大量使用它并且它将与我们的其余代码保持一致。
  • 我怀疑这只是意味着您的代码可以简化 很多 :) XmlDocument 没有非常干净的方式来迭代所有元素是一种痛苦:(
  • 是的!你实际上是对的:-)。

标签: c# .net xml visual-studio-2010 xmldocument


【解决方案1】:

如果你可以使用 LINQ to XML,那很简单:

var results = doc.Descendants()
                 .Where(x => x.Name.LocalName.StartsWith("Store") || 
                             x.Name.LocalName.StartsWith("SS"));

使用XmlDocument 更难,因为没有直接等效于Descendants()DescendantsAndSelf。您可以编写自己的扩展方法:

// I'm assuming we don't mind too much about the ordering...
public static IEnumerable<XmlElement> DescendantsAndSelf(this XmlElement node)
{
    return new[] { node }.Concat(node.ChildNodes
                                     .OfType<XmlElement>()
                                     .SelectMany(x => x.DescendantsAndSelf()));
}

那么你可以使用:

var results = doc.DocumentElement.DescendantsAndSelf()
                 .Where(x => x.LocalName.StartsWith("Store") || 
                             x.LocalName.StartsWith("SS"));

【讨论】:

  • 嗨乔恩!感谢您的答复。在编写上述扩展方法时,我收到一个编译时错误,提示 system.xml.xmlelement does not contain a defintion for descendants
  • @PowerCoder:现在修复 - 再试一次。
猜你喜欢
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-24
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
相关资源
最近更新 更多