具有递归子定义的XML到Java对象

时间:2018-03-23 15:05:01

标签: java xml jackson jaxb

如何将此XML转换为Java对象?

 <template>
        <condition name="A">
            <li value="A">
                <condition name="B">
                    <li value="BB">Value B</li>
                    <li value="BBB">Value BBB</li>
                </condition>
            </li>
            <li>
                <condition name="C">
                    <li value="CC">Value CC</li>
                    <li value="CCC">Value CCC</li>
                    <li>
                        <condition name="D">
                            <li value="DD">Value DD</li>
                            <li value="DDD">Value DDD</li>
                         </condition>
                    </li>
                </condition>
            </li>
        </condition>
    </template>

Condition必须包含Li代码,而li代码可能包含另一个condition,而condition代码li可能包含另一个代码condition {1}}标记。

2 个答案:

答案 0 :(得分:0)

JAXB,

首先,您需要在XML之后创建一个模型类,然后使用JAXB转换为java obj

答案 1 :(得分:0)

您需要通过具有一些@Xml...注释的相应Java类对XML元素建模。 这是相当直截了当的。 涉及递归的事实不会引起任何其他问题。

建模<template>根元素(使用嵌套<condition>元素)的类:

@XmlRootElement(name = "template")
@XmlAccessorType(XmlAccessType.FIELD)
public class Template {

    @XmlElement(name = "condition")
    private Condition condition;

    // getters and setters
}

<condition>元素建模的类(具有嵌套的<li>元素):

@XmlAccessorType(XmlAccessType.FIELD)
public class Condition {

    @XmlAttribute(name = "name")
    private String name;

    @XmlElement(name = "li")
    private List<ListItem> listItems;

    // getters and setters
}

<li>元素建模的类(具有嵌套的<condition>元素):

@XmlAccessorType(XmlAccessType.FIELD)
public class ListItem {

    @XmlAttribute(name = "value")
    private String value;

    @XmlElement(name = "condition")
    private Condition condition;

    // getters and setters
}

您可以使用转换XML测试所有这些类 - &gt; Java - &gt;像这样的XML:

JAXBContext context = JAXBContext.newInstance(Template.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Template template = (Template) unmarshaller.unmarshal(new File("template.xml"));
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(template, System.out);