2016-05-15 169 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,這只是一個個人喜好的問題,因爲改進很可能可以忽略不計。