有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图从salesforce提供的以下字符串响应中获取标记值

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://soap.sforce.com/2006/04/metadata">
   <soapenv:Body>
      <listMetadataResponse>
         <result>
            <createdById>00528000001m5RRAAY</createdById>
            <createdByName>Hariprasath Thanarajah</createdByName>
            <createdDate>1970-01-01T00:00:00.000Z</createdDate>
            <fileName>objects/EmailMessage.object</fileName>
            <fullName>EmailMessage</fullName>
            <id />
            <lastModifiedById>00528000001m5RRAAY</lastModifiedById>
            <lastModifiedByName>Hariprasath Thanarajah</lastModifiedByName>
            <lastModifiedDate>1970-01-01T00:00:00.000Z</lastModifiedDate>
            <namespacePrefix />
            <type>CustomObject</type>
         </result>
      </listMetadataResponse>
   </soapenv:Body>
</soapenv:Envelope>

上面我们有标签<fullName>。我需要获取标记中的值并将其放入字符串数组中。我尝试过使用substring方法,但它只返回一个值。有人能建议我这样做吗


共 (3) 个答案

  1. # 1 楼答案

    我试过像下面这样

    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;
    }
    

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

    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. # 2 楼答案

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

    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);    
    }    
    }    
    
  3. # 3 楼答案

    如果您只想解析这个元素,可以使用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-WSAPI的内容,以创建使用SalesforceWeb服务的SOAP客户端