2016-05-15 15 views
0

同じ名前の "reason"の要素が2つあります。私が//*: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() 

を内部の "詳細") "

、最初に //を避けるすなわち、より具体的なパスを使用して、大規模なXML文書の

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

で結果をします:

は、上記の祖先detailsを持っていないreason要素を見つけるのように表すことができます。より効率的XPath:

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

小さなXMLの場合、改善はごくわずかですが、個人的な好みの問題です。

関連する問題