2017-05-24 18 views
1

私はXPathを初めて使用しています。私は次のSOAP応答を持っています:XPathを使用したSOAP応答の解析Java

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <addParentResponse xmlns="urn:JadeWebServices/NetsuiteCustomer/"> 
      <addParentResult>Organisation xxxxx already exists - use UpdateParent method instead</addParentResult> 
     </addParentResponse> 
    </soap:Body> 
</soap:Envelope> 

"addParentResult"の価値を誰かに教えてください。

よろしく、 Anirban。

/soap:Envelope/soap:Body/parentns:addParentResponse/parentns:addParentResult/text()

私は、XPathにparentnsを追加した理由は、あなたのXMLが名前空間を持っており、あなたのXPathプロセッサは、それらについて知っておくべきことです。

+0

はあなたのために、以下の回答作業をしましたか? – SomeDude

答えて

0

次のXPathは、所望の結果を与える必要があります。しかし、addParentResponseには接頭辞がなく、デフォルトの名前空間があります。この場合、xpath式にプレフィックスを追加してから、xpathプロセッサーにparentns接頭辞の値は"urn:JadeWebServices/NetsuiteCustomer/"であることを伝えます。それはNamespaceContextによって行われます。

もなり、それがJavaでsetNamespaceAware(true);

コードを使用して名前空間を認識する必要があることをDocumentBuilderFactoryを教えてください:

try 
    { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     dbf.setNamespaceAware(true); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 

     Document doc = db.parse(new File("soapResponse.xml")); 

     XPathFactory xPathFactory = XPathFactory.newInstance(); 
     XPath xpath = xPathFactory.newXPath(); 
     javax.xml.namespace.NamespaceContext ns = new javax.xml.namespace.NamespaceContext() 
     { 

      @Override 
      public String getNamespaceURI(String prefix) 
      { 
       if ("soap".equals(prefix)) 
       { 
        return "http://schemas.xmlsoap.org/soap/envelope/"; 
       } 
       else if ("xsi".equals(prefix)) 
       { 
        return "http://www.w3.org/2001/XMLSchema-instance"; 
       } 
       else if ("xsd".equals(prefix)) 
       { 
        return "http://www.w3.org/2001/XMLSchema"; 
       } 
       else if ("xml".equals(prefix)) 
       { 
        return javax.xml.XMLConstants.XML_NS_URI; 
       } 
       else if ("parentns".equals(prefix)) 
       { 
        return "urn:JadeWebServices/NetsuiteCustomer/"; 
       } 

       return javax.xml.XMLConstants.NULL_NS_URI; 
      } 

      @Override 
      public String getPrefix(String namespaceURI) 
      { 
       return null; 
      } 

      @Override 
      public Iterator<?> getPrefixes(String namespaceURI) 
      { 
       return null; 
      } 

     }; 


     xpath.setNamespaceContext(ns); 
     XPathExpression expr = xpath.compile("/soap:Envelope/soap:Body/parentns:addParentResponse/parentns:addParentResult/text()"); 


     Object exprEval = expr.evaluate(doc, XPathConstants.STRING); 
     if (exprEval != null) 
     { 
      System.out.println("The text of addParentResult is : " + exprEval); 
     } 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

このコードをテストするには、というファイルにあなたのXMLを入れますsoapResponse.xmlはあなたのJavaファイルと同じレベルにあります。 System.out.println()から

出力は次のとおりです。

The text of addParentResult is : Organisation xxxxx already exists - use UpdateParent method instead

関連する問題