XPATH - 获取特定节点

时间:2016-09-08 13:58:50

标签: xml xpath

鉴于以下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)以下的所有信息。

有什么建议吗?

3 个答案:

答案 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
相关问题