使用JAXB解组嵌套XML

时间:2018-11-08 17:39:22

标签: java xml jaxb

我必须将XML解组到POJO,但是XML结构不好,我找不到实现该目标的方法。

XML结构:

<CURRENT_VALUES>
    <agency>
        <value xsi:type="xs:long" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">123</value>
    </agency>
    <company>
        <value xsi:type="xs:long" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">1</value>
    </company>
    <channel>
        <value xsi:type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">TEST</value>
    </channel>
</CURRENT_VALUES>

我这样创建了一个POJO:

public class EventoModel 
{
    private String agency;
    private String company;
    private String channel;

    public String getAgency() {
        return agency;
    }

    public void setAgency(String agency) {
        this.agency = agency;
    }

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public String getChannel() {
        return channel;
    }

    public void setChannel(String channel) {
        this.channel = channel;
    }
}

问题在于“值”元素。
当我尝试解组时,POJO属性为空(或为null)。

JAXBContext jaxbContext = JAXBContext.newInstance(EventoModel.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
XMLOutputter outputter = new XMLOutputter();
StringReader reader = new StringReader(outputter.outputString(xml));
EventoModel evento = (EventoModel) unmarshaller.unmarshal(reader);

1 个答案:

答案 0 :(得分:1)

XML元素$("div").on("click", function(event) { event.preventDefault(); $("html, body").animate({ scrollLeft: "100px" }, "slow"); }); <agency><company>具有相当复杂的嵌套结构。 因此,将它们建模为Java <channel>属性太简单了。

相反,您需要一个单独的POJO类。 因为这三个具有相同的结构,所以我们可以为它们使用通用的类。 缺少更好的名称,我们将其称为String类。 请注意,所有3个属性均由@XmlElement注释。

Ìtem

@XmlRootElement(name = "CURRENT_VALUES") @XmlAccessorType(XmlAccessType.FIELD) public class EventoModel { @XmlElement private Item agency; @XmlElement private Item company; @XmlElement private Item channel; // public getters and setters (omitted here for brevity) } 类如下所示。 它包含一个名为Item的属性,用于对XML元素value进行建模。 再次注意,该属性用@XmlElement

注释
<value>

XML元素@XmlAccessorType(XmlAccessType.FIELD) public class Item { @XmlElement private Value value; // public getters and setters (omitted here for brevity) } 仍然很复杂。 因此,我们需要另一个POJO类对其进行建模。我们将其称为<value>类。

Value<value ...>之间的XML文本由属性建模 </value>,需要用@XmlValue注释。

XML属性String text由属性建模 xsi:type="...",需要由@XmlAttribute注释。 特别注意其String type参数,它对应于XML名称空间 由namespace给出。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

下面的屏幕截图(从调试器中获取)将整体可视化 Java结构并确认解组工作正常:

screenshot