xpath表达式根据兄弟的值读取值

时间:2017-02-24 23:02:16

标签: xpath

我在xml以下,想要阅读'价值'名称与' test2'匹配的标记。我使用下面的xpath,但没有用。有人可以帮忙。

/*[ local-name()='OutputData']/*[ local-name()='OutputDataItem']/*[ local-name()='Name'][normalize-space(.) = 'test2']//*[local-name()='Value']/text()

             <get:OutputData>
              <get:OutputDataItem>
                 <get:Name>test1</get:Name>
                 <get:Value/>
              </get:OutputDataItem>
              <get:OutputDataItem>
                 <get:Name>test2</get:Name>
                 <get:Value>B5B4</get:Value>
              </get:OutputDataItem>
              <get:OutputDataItem>
                 <get:Name>test3</get:Name>
                 <get:Value/>
              </get:OutputDataItem>
              <get:OutputDataItem>
                 <get:Name>OP_VCscEncrptCd_VAR</get:Name>
                 <get:Value/>
              </get:OutputDataItem>                  
           </get:OutputData>

由于

2 个答案:

答案 0 :(得分:2)

我认为这应该有效:

//*[local-name()="get:Name" and text()="test2"]/following-sibling::*[local-name()="get:Value"]/text()

答案 1 :(得分:2)

你很亲密,但由于get:nameget:value是兄弟姐妹,你需要稍微调整你的XPath。

您的XPath试图解决get:value后代的get:name元素,而不是兄弟姐妹。将过滤get:name的条件移动到谓词中,然后逐步进入get:value

/*[ local-name()='OutputData']/*[ local-name()='OutputDataItem']
  [*[ local-name()='Name'][normalize-space(.) = 'test2']]/*[local-name()='Value']/text()

您还可以在get:name上合并谓词过滤条件并使用and

/*[ local-name()='OutputData']/*[ local-name()='OutputDataItem']
  [*[ local-name()='Name' and normalize-space(.) = 'test2']]/*[local-name()='Value']/text()