【问题标题】:All the nodes having an attribute所有具有属性的节点
【发布时间】:2010-11-29 22:07:35
【问题描述】:

我可以使用某种 xpath 语法来获取下面 xml 中存在 identifierref 的所有节点(包括子节点)吗?我一直在尝试类似XmlNodeList nodeList = xmlDoc.SelectNodes("//@identifierref"); 的东西,但这不会返回项目节点下方的子标题节点。理想情况下,我想获得一个节点列表,它可以访问存在 identifierref 的项目节点和它们下面的标题节点。下面是我正在使用的 xml。提前致谢。

<organization xmlns:adlcp="test1" xmlns="test2">
      <title>1.2 Tester</title>
      <item identifier="C2_LESSON1">
        <title>TestName1</title>
        <item identifier="I_SCO1" identifierref="SCO01">
          <title>Tester SCO 1</title>
        </item>
      </item>
      <item identifier="C2_LESSON2">
        <title>TestName2</title>
        <item identifier="I_SCO2" identifierref="SCO01">
          <title>Tester SCO 2</title>
        </item>
      </item>
      <item identifier="C2_LESSON3">
        <title>TestName3</title>
        <item identifier="I_SCO3" identifierref="SCO01">
          <title>Tester SCO 3</title>
        </item>
      </item>
    </organization>

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    我想获取一个节点列表,其中包含 访问具有 identifierref 存在和标题 它们下面的节点

    //item[@identifier]
    

    以上选择文档中具有identifier 属性的所有item 元素。

    如果您还想选择 title 元素子元素。

    //item[@identifier]|//item[@identifier]/title
    

    但节点集结果顺序取决于宿主语言(最适用于文档顺序)。也没有“分组”功能:您不能遍历每两个,因为可能缺少一些 title

    因此,首先使用第一个 XPath 表达式,然后使用任何 DOM 方法或相关 XPath 表达式遍历那些 item 以获得 title

    title
    

    【讨论】:

    • 另一个没有两个绝对路径联合的表达式://*[(self::item|self::title/parent::item)[@identifier]],但它并没有更短并且可能效率不高。