2015-07-19 21 views
1

我有以下soap響應保存爲內聯字符串。我只是將其格式化以便於閱讀:SOAP Response配對

<?xml version='1.0' encoding='UTF-8'?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <ns:getUserResponse xmlns:ns="http://www.cisco.com/AXL/API/10.0"> 
      <return> 
       <user uuid="{SOME-IDENTIFIER-HERE}"> 
        <firstName>MyFirstName</firstName> 
        <middleName /> 
        <lastName>MyLastName</lastName> 
        <userid>myId</userid> 
        <password /> 
        <pin /> 
        <mailid>[email protected]</mailid> 
        <department /> 
        <manager /> 
        <userLocale /> 
       </user> 
      </return> 
     </ns:getUserResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

我該如何解析這個問題並在此響應中獲取特定元素值? 我正在考慮先將字符串轉換爲XML,然後再解析。

任何人都可以闡明我如何實現這一目標?

感謝

+0

消息_is_ XML,所以可以使用[各種解析器]中的任一項(HTTP://計算器。 com/questions/373833/best-xml-parser-for-java)用於獲取內容。但是,爲什麼你需要解析消息?有許多Web服務框架,比如[CXF](http://cxf.apache.org/),它們通過抽象出消息處理部分來讓你的生活更輕鬆。 –

回答

1

您可以使用XPath,例如下面

import java.io.File; 

import java.io.IOException; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathExpressionException; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.xml.sax.SAXException; 

public class XPathTest { 

    public static void main(String[] args) throws XPathExpressionException, SAXException, IOException, ParserConfigurationException { 

     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse(new File("response.xml")); 
     XPath xxPath = XPathFactory.newInstance().newXPath(); 
     String expression = "/Envelope/Body/getUserResponse/return/user"; 
     javax.xml.xpath.XPathExpression cc = xxPath.compile(expression); 
     String result = cc.evaluate(doc); 
     System.out.println("Result:: " + result); 
    } 
} 

response.xml

<?xml version='1.0' encoding='UTF-8'?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     <ns:getUserResponse xmlns:ns="http://www.cisco.com/AXL/API/10.0"> 
      <return> 
       <user uuid="{SOME-IDENTIFIER-HERE}"> 
        <firstName>MyFirstName</firstName> 
        <middleName /> 
        <lastName>MyLastName</lastName> 
        <userid>myId</userid> 
        <password /> 
        <pin /> 
        <mailid>[email protected]</mailid> 
        <department /> 
        <manager /> 
        <userLocale /> 
       </user> 
      </return> 
     </ns:getUserResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

輸出:

Result:: 
        MyFirstName 

        MyLastName 
        myId 


        [email protected] 
+0

讓我試試看看它是否有效。 :) 釷,我真的需要指定我想從中獲得的元素,比如,我只想要'firstName'。 – Miki

+0

這就像一個魅力! 我不得不將我需要的字段添加到表達式中: String myField =「firstName」; String expression =「/ Envelope/Body/getUserResponse/return/user /」+ myField; – Miki

+1

然後只用這個 - 'String expression =「/ Envelope/Body/getUserResponse/return/user/firstName」;' – TheCodingFrog