如何使用 Java 从 SOAP 响应中检索元素值?

问题描述 投票:0回答:3
java xml soap
3个回答
9
投票

我已经尝试过如下,

public static Document loadXMLString(String response) throws Exception
{
    DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    InputSource is = new InputSource(new StringReader(response));

    return db.parse(is);
}

public static List<String> getFullNameFromXml(String response, String tagName) throws Exception {
    Document xmlDoc = loadXMLString(response);
    NodeList nodeList = xmlDoc.getElementsByTagName(tagName);
    List<String> ids = new ArrayList<String>(nodeList.getLength());
    for(int i=0;i<nodeList.getLength(); i++) {
        Node x = nodeList.item(i);
        ids.add(x.getFirstChild().getNodeValue());             
        System.out.println(nodeList.item(i).getFirstChild().getNodeValue());
    }
    return ids;
}

从上面的代码中,您将获得 ids 列表。之后,您可以将它们放入字符串数组并将它们返回到字符串数组,如下所示,

List<String> output = getFullNameFromXml(response, "fullName");
String[] strarray = new String[output.size()];
output.toArray(strarray);
System.out.print("Response Array is "+Arrays.toString(strarray));

2
投票

使用以下代码解析 SOAP 响应并获取元素值。
将 XML 响应保存在系统上的任何位置。调用方法 getResult()。它是一个通用方法。它采用 Web 服务响应的有效负载类类型并返回 java 对象。

private static String readXMLFile(String fileName) {
    File xmlFile = new File("response file path from step 1");
    Reader fileReader = new FileReader(xmlFile);
    BufferedReader bufReader = new BufferedReader(fileReader);
    StringBuilder sb = new StringBuilder();
    String line = bufReader.readLine();
    while (line != null) {
        sb.append(line).append("\n");
        line = bufReader.readLine();
    }
    String xml2String = sb.toString();
    bufReader.close();
}
        
public <T> T getResult(String xml, String path, Class<T> type) {    
    final Node soapBody = getSoapBody(xml, path);    
    return getInstance(soapBody, type);    
}    

private Node getSoapBody(String xml, String path) {
    try {
        SOAPMessage message = getSoapMessage(xml, path);
        Node firstElement = getFirstElement(message);
        return firstElement;
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
} 

private SOAPMessage getSoapMessage(String xml, String path) throws SOAPException, IOException {
    MessageFactory factory = MessageFactory.newInstance();
    FileInputStream fis = new FileInputStream(path);
    BufferedInputStream inputStream = new BufferedInputStream(fis);
    return factory.createMessage(new MimeHeaders(), inputStream);
}    

private Node getFirstElement(SOAPMessage message) throws SOAPException {
    final NodeList childNodes = message.getSOAPBody().getChildNodes();
    Node firstElement = null;
    for (int i = 0; i < childNodes.getLength(); i++) {
        if (childNodes.item(i) instanceof Element) {
            firstElement = childNodes.item(i);
            break;
        }
    }
    return firstElement;
}

private <T> T getInstance(Node body, Class<T> type) {
    try {
        JAXBContext jc = JAXBContext.newInstance(type);
        Unmarshaller u = jc.createUnmarshaller();
        return (T) u.unmarshal(body);
    } catch (JAXBException e) {
        throw new RuntimeException(e);
    }
}

0
投票

如果您只想解析这个单个元素,您可以使用 SAX 或 StAX 解析器,如此处所述 https://www.javacodegeeks.com/2013/05/parsing-xml-using-dom-sax-and-stax- parser-in-java.html.

   SAXParserFactory factory = SAXParserFactory.newInstance();
    SAXParser saxParser = factory.newSAXParser();

    DefaultHandler handler = new DefaultHandler() {

    boolean fullName = false;

    public void startElement(String uri, String localName,String qName, 
                Attributes attributes) throws SAXException {

        System.out.println("Start Element :" + qName);

        if (qName.equals("fullName")) {
            fullName = true;
        }
    }

    public void characters(char ch[], int start, int length) throws SAXException {

        if (fullName ) {
            System.out.println("Full Name : " + new String(ch, start, length));
            fullName = false;
        }
    }
}
saxParser.parse(mySoapResponse, handler);

或者您可能想阅读有关 JAX-WS API 的更多信息,以创建 SOAP 客户端以使用 Salesforce Web 服务。

© www.soinside.com 2019 - 2024. All rights reserved.