如何使用 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> 。我需要获取标签内的值并将其放入 String 数组中。我试过使用 substring 方法,但它只返回一个值。谁能建议我这样做?

原文由 Hariprasath 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 659
2 个回答

我试过如下,

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

原文由 Hariprasath 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用以下代码解析 SOAP 响应并获取元素值。

将 XML 响应保存在系统的任何位置。调用方法 getResult()。它是一种通用方法。它采用 web 服务响应的负载类类型并返回 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);
}
}

原文由 Abhishek Jha 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题