2017-02-24 61 views
2

我在xml下面,想读取名称与'test2'匹配的'Value'标签的值。我使用下面的xpath,但没有工作。有人可以帮忙吗?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

这应该工作,我认为:

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

谢谢,它的工作 – techq

+0

np,请记住接受它是否帮助你 – eLRuLL

2

你接近,但由于get:nameget:value是兄弟,您需要调整您的XPath一小。

您的XPath试图寻址作为get:name的后代的get:value元素,而不是兄弟姐妹。此举被过滤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()