【问题标题】:Select some of the elements by name?按名称选择一些元素?
【发布时间】:2019-01-25 23:03:20
【问题描述】:

例如

的XML
<X>
  <A>aaa</A>
  <B>bbb</B>
  <C>ccc</C>
</X>

如何在一个 XPATH 中选择 A 项和 C 项?

var xmldoc = new XmlDocument();
xmldoc.LoadXml(x);
var r = xmldoc.SelectSingleNode("/X/(A, C)"); // r should have aaa and ccc only

(xmldoc.SelectSingleNode("/X/*[local-name() = \"A\" or local-name() = \"C\"]")).OuterXml 返回&lt;A&gt;aaa&lt;/A&gt;?

【问题讨论】:

  • 能否请您澄清一下您希望如何表示“应该有 aaa 和 ccc”? (看起来您希望将两个节点选为一个......这很奇怪,我什至不确定是否可能。澄清为什么选择多个节点不起作用会有所帮助)
  • 请注意,路径表达式 /X/(A, C) 从 XPath 2.0 开始有效,但您似乎使用的是 Microsoft 的 XPath 实现,它只支持古老的 XPath 1.0 标准。

标签: c# xml xpath


【解决方案1】:

试试这个

var r = xdoc.SelectNodes("//X/C | //X/A");

var xmldoc = new XmlDocument();
xmldoc.LoadXml(x);
var r = xmlDoc.SelectNodes("//X/C | //X/A");

foreach (XmlNode i in r)
    Debug.WriteLine(i.Value);

【讨论】:

  • 我实际上使用了 XPath 求值器。我没有看到他使用了 SelectSingleNode。不同的是我无法验证 OP 的查询
【解决方案2】:

这个 XPath,

/X/*[self::A or self::C]

将选择X 的所有A 和C 子级。

请注意,由于您要选择多个元素,因此您需要使用 XmlNode.SelectNodes(), with example 而不是 .SelectSingleNode(),并准备处理它返回的 XmlNodeList。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-14
    • 2019-03-28
    • 2011-04-23
    • 1970-01-01
    • 2017-01-16
    • 2010-11-09
    • 2014-11-10
    相关资源
    最近更新 更多