Сбой синтаксического анализа XML - PullRequest
0 голосов
/ 17 марта 2019

Я получаю следующий ответ XML String после вызова веб-службы SOAP. Как я могу разобрать ответ обратно на объект Java, чтобы я мог обработать ErrMsg и Status соответственно? Я пытался с приведенным ниже кодом, но продолжаю получать ошибку

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 или внешнюю библиотеку, которая поддерживается регулярно и обновляется.

Ответы [ 2 ]

2 голосов
/ 17 марта 2019

Похоже, у вас есть NewDataSet классы в вашей POJO модели.Проверьте эту строку кода 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 модель, вы можете десериализовать XML непосредственно к ней, используяreadValue метод.

0 голосов
/ 19 марта 2019

Нашел причину, она была решена путем удаления 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;
...