Получить список в XML - PullRequest
       2

Получить список в XML

0 голосов
/ 22 сентября 2019

Я хочу преобразовать этот основной тег XML с несколькими внутренними списками:

<statuses>
        <status code="201.0000" description="....." severity="information"/>
        <status code="200.1077" description="....." severity="information"/>
        <status code="200.1077" description="....." severity="information"/>
</statuses>

Я пробовал это:

@XmlRootElement(name = "payment")
@XmlAccessorType(XmlAccessType.FIELD)
public class mainXML {

    @XmlElement(name = "statuses")
    public List<Statuses> statuses;
    ....
}

// Внутренний объект

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Statuses {

    @XmlElement(name = "status")
    private Status status;    
    .....
}

// Внутренний объект

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Status {   

    @XmlElement(name = "status")
    private String status;

    @XmlAttribute
    public String code;

    @XmlAttribute
    public String severity
    .........
}

Но я получаю

    <statuses>
        <status code="500.1072" description="....." severity="warning"/>
    </statuses>

Вы знаете, как правильно реализовать несколько тегов statusв основной тег statuses?

Я получаю ответ, используя WebFlux, и печатаю XML, используя этот код:

//Create JAXB Context
            JAXBContext jaxbContext = JAXBContext.newInstance(EnrolCheckResponse.class);

            //Create Marshaller
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

            //Required formatting??
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

            //Print XML String to Console
            StringWriter sw = new StringWriter();

            //Write XML to StringWriter
            jaxbMarshaller.marshal(employee, sw);

            //Verify XML Content
            String xmlContent = sw.toString();
            System.out.println(xmlContent);

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Вам на самом деле не нужен промежуточный класс «Статусы», JAXB уже знает, что означает список.

Вместо этого задайте имя Status 'XmlRootElement, чтобы JAXB знал, какие узлы ожидать внутри"статусы"

@XmlRootElement(name = "payment")
@XmlAccessorType(XmlAccessType.FIELD)
public class mainXML {

    @XmlElement(name = "statuses") // name of the wrapper
    public List<Status> statuses;
    ...
}

@XmlRootElement(name = "status")  // name of a single node
@XmlAccessorType(XmlAccessType.FIELD)
public static class Status {

    @XmlElement(name = "status")
    private String status;

    @XmlAttribute
    public String code;

    @XmlAttribute
    public String description;

    @XmlAttribute
    public String severity;
    ...
}
0 голосов
/ 24 сентября 2019

@XmlElementWrapper делает то, что вы хотите.@XmlElement используется для каждой записи в статусах.@XmlElementWrapper используется, чтобы обернуть их в один тег.

@XmlRootElement(name = "payment")
@XmlAccessorType(XmlAccessType.FIELD)
public class mainXML {

    @XmlElementWrapper(name="statuses")
    @XmlElement(name = "status")
    public List<Statuses> statuses;
    ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...