使用 JAXB 解组嵌套 XML

Unmarshall Nested XML with 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;
    }
}

问题是 "value" 元素。
当我尝试解组时,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);

XML 元素 <agency><company><channel> 具有相当复杂的嵌套结构。 因此,将它们建模为 Java String 属性太简单了。

相反,您需要一个单独的 POJO class。 因为这 3 个具有相同的结构,所以我们可以对它们使用一个通用的 class。 没有更好的名字让我们称之为 class Ìtem。 请注意,所有 3 个属性都由 @XmlElement.

注释
@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 class 可以如下所示。 它包含一个名为 value 的 属性,对 XML 元素 <value> 建模。 再次注意,属性 被注释为 @XmlElement

@XmlAccessorType(XmlAccessType.FIELD)
public class Item {

    @XmlElement
    private Value value;

    // public getters and setters (omitted here for brevity)
}

XML 元素 <value> 仍然相当复杂。 因此,我们还需要另一个 POJO class 来对其建模。我们称 class Value.

<value ...></value> 之间的 XML 文本由 属性 建模 String text 需要注解 @XmlValue.

XML 属性 xsi:type="..." 由 属性 建模 String type 需要用 @XmlAttribute 注释。 特别注意它的 namespace 参数对应于 XML 命名空间 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance".

给出
@XmlAccessorType(XmlAccessType.FIELD)
public class Value {

    @XmlAttribute(namespace = "http://www.w3.org/2001/XMLSchema-instance")
    private String type;

    @XmlValue
    private String text;

    // public getters and setters (omitted here for brevity)
}

下面的屏幕截图(从调试器中截取)显示了整体 Java 结构并确认解组工作正常: