鉴于以下XML,我想检索节点下面的所有节点,其中包含,在本例中为,EEUU。
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<ns1:L>
<ns1:A>33</ns1:A>
<ns1:B>ok</ns1:B>
<ns1:C>
<ns1:D>EEUU</ns1:D>
<ns1:E>1</ns1:E>
<ns1:F>
<ns1:G>
<ns1:G>20</ns1:G>
<ns1:H>NY</ns1:H>
</ns1:G>
<ns1:I>
<ns1:J>30</ns1:J>
<ns1:K>SFO</ns1:K>
</ns1:I>
<ns1:I>
<ns1:J>40</ns1:J>
<ns1:K>JFK</ns1:K>
</ns1:I>
</ns1:F>
</ns1:C>
</ns1:L>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
到目前为止,我已尝试使用绝对路径,但我无法获得EEUU(20,NY,30,SFO,40,JFK)以下的所有信息。
有什么建议吗?
答案 0 :(得分:1)
这可以完成工作:
//ns1:D[text() = 'EEUU']/following::*/text()[normalize-space(.)]
根据@Uwe Block的建议进行编辑:
//ns1:D[text() = 'EEUU']/following-sibling::*/descendant-or-self::*/text()[normalize-space(.)]
对于稍微改变的xml,此版本更精确,更好。现在它只有 跟随兄弟姐妹和他们的孩子。
答案 1 :(得分:0)
//ns1:C[ns1:D = 'EEUU']//*
将为您提供相应<n1:C>
内的所有元素。
在此开始工作之前,您必须注册名称空间前缀ns1
和URI。请查阅XML库或-tool的文档以了解具体方法。 (为XPath查询注册名称空间是一项非常常见的操作,您会发现每个环境都有大量的建议。)
答案 2 :(得分:0)
我仍然很难正确使用XPATH命名空间。所以,我找到了一个忽略命名空间的解决方案(可能不是最好的想法,但它对我有用):
//*[local-name() = "D"][text() = "EEUU"]/following-sibling::*/descendant-or-self::*/text()[normalize-space(.)]
除local-name()
外,这与@ uL1的答案非常相似。但是,它不需要所有以下节点,而只需要以下兄弟节点及其所有后代。
我使用XPATH Tester/Evaluator - Online Toolz(在使用Simple online XPath tester的帮助修复了格式错误的XML之后)对其进行了测试,并返回了结果
1
-----------------------
20
-----------------------
NY
-----------------------
30
-----------------------
SFO
-----------------------
40
-----------------------
JFK