JAXB Родитель и Дочерний узел То же имя.Дочерний узел возвращает нулевые значения - PullRequest
1 голос
/ 04 июня 2019

Я использую веб-сервис и получаю ответ XML с родительским и дочерним узлами с одинаковыми именами.Проблема в том, что последняя иерархия не имеет значений.

С моей точки зрения JAXB должен обрабатывать List TestDetails.

Конверт класса:

@XmlRootElement(name="Envelope", namespace="http://schemas.xmlsoap.org/soap/envelope/") 
@XmlAccessorType(XmlAccessType.FIELD)
public class Envelope {

@XmlElement(name="Body", namespace="http://schemas.xmlsoap.org/soap/envelope/")
private Body Body;

}

Тело класса:

@XmlAccessorType(XmlAccessType.FIELD)
public class Body {

@XmlElement(name="GetTestlistWithConnectionsResponse", namespace="http://tempuri.org/")
private GetTestlistWithConnectionsResponse GetTestlistWithConnectionsResponse;

public Body() {}

}

Класс GetTestlistWithConnectionsResponse:

@XmlAccessorType(XmlAccessType.FIELD)
public class GetTestlistWithConnectionsResponse {

public GetTestlistWithConnectionsResponse() {}

@XmlElement(name="GetTestlistWithConnectionsResult", 
namespace="http://tempuri.org/")
private GetTestlistWithConnectionsResult GetTestlistWithConnectionsResult;


}

Класс GetTestlistWithConnectionsResult:

@XmlAccessorType(XmlAccessType.FIELD)
public class GetTestlistWithConnectionsResult {

public GetTestlistWithConnectionsResult() {}

@XmlElement(name="TestDetails", namespace="http://schemas.datacontract.org/XXX")
private TestDetails TestDetails ;

}

Класс TestDetails:

@XmlAccessorType(XmlAccessType.FIELD)
public class TestDetails{

public TestDetails() {}

@XmlElement(name="A", namespace="http://schemas.datacontract.org/XXX")
private String A;

@XmlElement(name="B", namespace="http://schemas.datacontract.org/XXX")
private String B;   

@XmlElement(name="TestDetails")
private List<TestDetails> TestDetails = new ArrayList<TestDetails>();

}

Структура XML:

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
       <s:Body>
          <GetTestlistWithConnectionsResponse xmlns="http://tempuri.org/">
             <GetTestlistWithConnectionsResult xmlns:a="http://schemas.datacontract.org/XXX" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <a:Error i:nil="true"/>
                <a:TestDetails>
                   <a:TestDetails>
                      <a:A>A</a:A>
                      <a:B>B</a:B>
                   </a:TestDetails>
                </a:TestDetails>
            </GetTestlistWithConnectionsResult>
           </GetTestlistWithConnectionsResponse>
       </s:Body>
    </s:Envelope>

Метод Unmarshall:

public Envelope unmarshallFromFile(){
    Envelope testDetail= null;
    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(Envelope.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        InputStream inStream = null;
        try {
            inStream = new FileInputStream(this.fileLoc);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        flightDetailsSN = (Envelope) jaxbUnmarshaller.unmarshal( inStream );
    } catch (JAXBException e) {
        e.printStackTrace();
    }

    return testDetail;
}

Когда я вызываю свой метод unmarshall, я получаю объект с: TestDetails Item с пустым списком.Я ожидал, что список содержит один элемент со значениями A и B.

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

A и B в вашем XML - это элементы, а не атрибуты.Попробуйте изменить

@XmlAttribute
private String A;
private String B;

на

@XmlElement(name = "A")
private String a;

@XmlElement(name = "B")
private String b;
0 голосов
/ 04 июня 2019

Попробуйте, изменив подэлемент или дочернее имя, если у вас нет проблем.(Я думаю, что это из-за того же имени для заголовка и подэлемента.)

<a:TestDetails>
    <a:TestDetail>
       <a:A>A</a:A>
       <a:B>B</a:B>
    </a:TestDetail>
</a:TestDetails>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...