如果兄弟节点具有特定值,如何使用XPath选择节点?

HOE*_*ANG 74 xml xpath

我有以下文件:

<a>
  <bb>abc</bb>
  <cc>ccc</cc>
  <dd>ddd</dd>
</a>
<a>
  <bb>zz</bb>
  <cc>1</cc>
  <dd>2</dd>
</a>
Run Code Online (Sandbox Code Playgroud)

<cc>如果<bb>是,我怎样才能获得使用XPath 的价值zz

Jen*_*rat 84

不确定为什么每个人都在查询兄弟姐妹,你也可以检查<bb/>与谓词谓词匹配的元素<a/>:

//a[bb/text() = "zz"]/cc/text()
Run Code Online (Sandbox Code Playgroud)

  • *"不确定为什么每个人都在询问兄弟姐妹"*:也许是因为这个问题是为了兄弟姐妹.. ;-) (13认同)
  • 好像我其实没看过标题.:)无论如何,答案仍然有效. (4认同)
  • 您的回答也询问兄弟姐妹。你只是没有使用 `*-sibling` 轴。+1虽然。 (3认同)

Sta*_*ley 27

你需要的是following-siblingXPath轴

//a/bb[text()="zz"]/following-sibling::cc[1]/text()
Run Code Online (Sandbox Code Playgroud)

在这里测试Xpath:http://www.xpathtester.com/obj/b55ec3ac-dfa4-4f44-81e8-f963ea4a0625

  • @HOESENGKIANG:您应该点击复选标记以"接受"此答案,或者您认为最能回答问题的答案. (4认同)

hr_*_*117 21

问:如果兄弟节点具有特定值,如何使用XPath选择节点?
因为后续兄弟和前兄弟只有"XPath Axes".如果位置得到修复,您可以使用其中一个.
但更好的是:
寻找cc是父母有子bb的价值'zz':

//cc[../bb='zz']
Run Code Online (Sandbox Code Playgroud)

  • 无论是那个还是`​​// a [bb ='zz']/cc`. (6认同)

Pet*_*ček 9

首先,您的示例不是格式良好的 XML。忽略这一点并且您没有很好地描述您的意图(您究竟想在哪种条件下选择什么?),我假设您想这样做:

//cc[preceding-sibling::bb[text()="zz"]]/text()
Run Code Online (Sandbox Code Playgroud)

它选择

TEXT VALUES OF ALL <CC> ELEMENTS
//cc                                    /text()
    THAT HAVE A PRECEDING SIBLING <BB>
    [preceding-sibling::bb             ]
                          THAT HAS TEXT VALUE EQUAL TO "zz"
                          [text()="zz"]
Run Code Online (Sandbox Code Playgroud)

你也可以写成

//bb[text()="zz"]/following-sibling::cc/text()
Run Code Online (Sandbox Code Playgroud)

请查看规范,它有一些非常易读的示例,您将从中学到很多东西。


Sal*_*ood 8

这个问题的另一个解决方案是

//bb[contains(.,'zz')]/../cc/text()

解释:任何在所有子节点中bb包含字符串的内容,然后转到该使用的父节点,现在我们可以访问如此返回的文本。'zz'bbbb..cc

我希望这个解释并不复杂。