解析XML失败

问题描述 投票:0回答:2

在调用SOAP Web服务之后,我得到以下响应XML String。我如何将响应解析回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());

new DataSet.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库或定期维护的外部库。

java xml soap-client
2个回答
2
投票

看起来你的NewDataSet模型中有很多POJO类。检查这行代码JAXBContext.newInstance(NewDataSet.class)并检查import是否导入了正确的代码因为异常说marshaller需要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"));
    }
}

如果你准备好了qazxsw poi模型,你可以使用POJO方法直接将qazxsw poi反序列化。


0
投票

找到原因,通过删除XML解决了

readValue

成为

namespace = "TransactionalSubmissionsSvcs"
© www.soinside.com 2019 - 2024. All rights reserved.