2016-05-15 124 views
0

我得到了2个元素,名称为“reason”。当我使用//*:reason/text()它给了我两个元素,但我需要第一个。 (不是“细节”内的那个)。请帮助..选择XPath中的特定元素

<xml xmlns:gob="http://osb.yes.co.il/GoblinAudit"> 
    <fault> 
     <ctx:fault xmlns:ctx="http://www.bea.com/wli/sb/context"> 
      <ctx:errorCode>BEA-382500</ctx:errorCode> 
      <ctx:reason>OSB Service Callout action received SOAP Fault response</ctx:reason> 
      <ctx:details> 
       <ns0:ReceivedFaultDetail xmlns:ns0="http://www.bea.com/wli/sb/stages/transform/config"> 
        <ns0:faultcode xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">soapenv:Server</ns0:faultcode> 
        <ns0:faultstring>BEA-380001: Internal Server Error</ns0:faultstring> 
        <ns0:detail> 
         <con:fault xmlns:con="http://www.bea.com/wli/sb/context"> 
          <con:errorCode>BEA-380001</con:errorCode> 
          <con:reason>Internal Server Error</con:reason> 
          <con:location> 
           <con:node>RouteTo_FinancialControllerBS</con:node> 
           <con:path>response-pipeline</con:path> 
          </con:location> 
         </con:fault> 
        </ns0:detail> 
       </ns0:ReceivedFaultDetail> 
      </ctx:details> 
      <ctx:location> 
       <ctx:node>PipelinePairNode2</ctx:node> 
       <ctx:pipeline>PipelinePairNode2_request</ctx:pipeline> 
       <ctx:stage>set maintain offer</ctx:stage> 
       <ctx:path>request-pipeline</ctx:path> 
      </ctx:location> 
     </ctx:fault> 
    </fault> 
</xml> 

回答

2

您使用的是//预选赛,这将下降到任何树,并找到reason所有出现。你可以尝试更加具体的关于子路径:

//fault/*:fault/*:reason/text() 

这将只匹配外reason而不是内部reason.

2

“......但我需要的第一个”

您可以使用位置索引来获得第一个匹配reason元素:

(//*:reason)[1]/text() 

“(不是里面的“细节”)“

上面可以表示为发现其不具有祖先detailsreason元件:

//*:reason[not(ancestor::*:details)]/text() 

对于一个大的XML文档中,使用更具体的路径即避免//开头,将在结果更高效的XPath:

/xml/fault/*:fault/*:reason/text() 

但是对于一个小的XML,这只是一个个人喜好的问题,因为改进很可能可以忽略不计。