XPath 1.0选择具有命名空间的兄弟姐妹

时间:2017-11-13 14:40:50

标签: c# xpath

我有以下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>

我试图让父母的firstsecond孩子。

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表达式错了吗?

1 个答案:

答案 0 :(得分:1)

  

第一个XPath表达式是错误的吗?

是的,它不是有效的XPath 1.0语法。在XPath 1.0中(之后,您不能拥有/

通过使用以下路径,您可以实现您尝试执行的操作,而无需重复任何节点名称:

/m:root/m:parent/*[self::m:first or self::m:second]

附注:避免使用//,除非您有特定的理由使用它。这对性能不利。