我有以下xml文件
<root xmlns="http://mynamespace">
<parent>
<first>text</first>
<second>more</second>
</parent>
<parent>
<first>2</first>
<second>3</second>
</parent>
<parent>
<first>aa</first>
<second>bb</second>
</parent>
</root>
我试图让父母的first
和second
孩子。
C#似乎遇到以下代码问题(错误发生在最后一行):
var rawXml = @"<root xmlns=""http://mynamespace"">
<parent>
<first>text</first>
<second>more</second>
<third>hello</third>
</parent>
<parent>
<first>2</first>
<second>3</second>
<parent>
<first>a</first>
<second>b</second>
</parent>
</parent>
<parent>
<first>aa</first>
<second>bb</second>
</parent>
</root>";
var xmlDoc = new XmlDocument();
xmlDoc.LoadXml(rawXml);
var ns = new XmlNamespaceManager(xmlDoc.NameTable);
ns.AddNamespace("m", "http://mynamespace");
var nav = xmlDoc.CreateNavigator();
var parents = nav.Select("//m:parent", ns);
Console.Write($"Got {parents.Count} parents.");
// this does not work
// error: Expression must evaluate to a node-set.
//var siblings = nav.Select("//m:parent/(m:first|m:second)", ns);
// but this does
var siblings = nav.Select("//m:parent/m:first|//m:parent/m:second", ns);
Console.Write($"Got {siblings.Count} children.");
我错过了什么吗?第一个XPath表达式错了吗?
答案 0 :(得分:1)
第一个XPath表达式是错误的吗?
是的,它不是有效的XPath 1.0语法。在XPath 1.0中(
之后,您不能拥有/
。
通过使用以下路径,您可以实现您尝试执行的操作,而无需重复任何节点名称:
/m:root/m:parent/*[self::m:first or self::m:second]
附注:避免使用//
,除非您有特定的理由使用它。这对性能不利。