解析 XML 失败

Parsing XML Failed

我在调用 SOAP Web 服务后得到以下响应 XML 字符串。我如何将响应解析回 Java 实体,以便我可以相应地处理 ErrMsgStatus?我尝试使用以下代码,但不断收到错误

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"NewDataSet"). Expected elements are <{TransactionalSubmissionsSvcs}NewDataSet>
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726)

字符串中的示例响应

 <NewDataSet>
  <SubmissionResult>
    <Status>200</Status>
    <RefNo>363180319bigKj83i</RefNo>
    <ErrMsg>Successful</ErrMsg>
  </SubmissionResult>
</NewDataSet>

示例客户端XML解析器

    JAXBContext jaxbContext = JAXBContext.newInstance(NewDataSet.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

    StringReader reader = new StringReader("Sample Response in String above");
    NewDataSet newDataSet = (NewDataSet) jaxbUnmarshaller.unmarshal(reader);
    System.out.println(newDataSet.getSubmissionResult());

NewDataSet.java

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
 "submissionResult"
})
@XmlRootElement(name = "NewDataSet")
public class NewDataSet {

 @XmlElement(name = "SubmissionResult", required = true)
 protected NewDataSet.SubmissionResult submissionResult;

 public NewDataSet.SubmissionResult getSubmissionResult() {
  return submissionResult;
 }

 public void setSubmissionResult(NewDataSet.SubmissionResult value) {
  this.submissionResult = value;
 }

 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "", propOrder = {
  "status",
  "refNo",
  "errMsg"
 })
 public static class SubmissionResult {

  @XmlElement(name = "Status")
  protected short status;
  @XmlElement(name = "RefNo", required = true)
  protected String refNo;
  @XmlElement(name = "ErrMsg", required = true)
  protected String errMsg;

  public short getStatus() {
   return status;
  }

  public void setStatus(short value) {
   this.status = value;
  }

  public String getRefNo() {
   return refNo;
  }

  public void setRefNo(String value) {
   this.refNo = value;
  }

  public String getErrMsg() {
   return errMsg;
  }

  public void setErrMsg(String value) {
   this.errMsg = value;
  }
 }

}

注意:如果可能的话,我更喜欢使用标准 java 库或定期更新的外部库。

您的 POJO 模型中似乎有很多 NewDataSet 类。检查这行代码 JAXBContext.newInstance(NewDataSet.class) 并检查 import 您是否导入了正确的代码,因为异常表明编组器期望 TransactionalSubmissionsSvcs.NewDataSet.

编辑前

你没有说你用的是什么工具。如果是 Jackson,您可以按如下方式解析 XML 有效负载:

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

import java.io.File;
import java.nio.file.Files;

public class XmlMapperApp {

    public static void main(String[] args) throws Exception {
        String xml = "your xml";

        parse(xml);
    }

    public static void parse(String xml) throws Exception {
        XmlMapper xmlMapper = new XmlMapper();
        xmlMapper.enable(SerializationFeature.INDENT_OUTPUT);

        JsonNode root = xmlMapper.readTree(xml);
        JsonNode result = root.at("/SendWithXMLResult");
        JsonNode jsonNode = xmlMapper.readTree(result.asText());
        JsonNode submissionResult = jsonNode.at("/SubmissionResult");

        System.out.println(submissionResult.get("Status"));
        System.out.println(submissionResult.get("ErrMsg"));
        System.out.println(submissionResult.get("RefNo"));
    }
}

如果您已经准备好 POJO 模型,您可以使用 readValue 方法直接反序列化 XML 到它。

找到原因,去掉namespace = "TransactionalSubmissionsSvcs"

解决了
@javax.xml.bind.annotation.XmlSchema(namespace = "TransactionalSubmissionsSvcs",elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.mailadapter;

成为

@javax.xml.bind.annotation.XmlSchema(elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.mailadapter;