首页 > 解决方案 > 接收 XML 列表

问题描述

我想用几个内部列表转换这个主要的 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);

标签: javajaxb

解决方案


您真的不需要中间的“状态”类,JAXB 已经知道列表的含义。

相反,设置 Status 的 XmlRootElement 的名称,以便 JAXB 知道在“statuses”中期望哪些节点

@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;
    ...
}

推荐阅读