将XML解析/反序列化为JavaObjects

Smo*_*oki 4 java xml xsd jaxb

我开始了一个小型的新项目,我想从XML反序列化对象.

我创建了一个xsd:

http://pastebin.com/n1pwjRGX

和一个示例XML文件:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<hdb>
    <country code="DE">
        <variableHoliday daysAfterEaster="49" name="PENTECOAST" />
        <fixedHoliday month="JANUARY" day="1" name="NEWYEAR" />
        <region code="sa">
            <fixedHoliday month="APRIL" day="1" name="FUNNYDAY" />
            <variableHoliday daysAfterEaster="0" name="EASTERSUNDAY" />
        </region>
        <region code="ba">
            <variableHoliday daysAfterEaster="12" name="CORPUSCHRISTI" />
        </region>
    </country>
    <country code="US">
        <fixedHoliday month="JULY" day="4" name="INDEPENDENCEDAY" />
    </country>
    <country code="AL">
        <fixedHoliday month="JULY" day="4" name="INDEPENDENCEDAY" />
    </country>
</hdb>
Run Code Online (Sandbox Code Playgroud)

哪个应该使用xsd等.

那么我怎样才能将这些XML的反序列化转化为一个漂亮的Java-Object Structure呢?

Mabe喜欢:

class HDB {
    private HashMap<CountryCode,Country> map;
}

class Country {
    private List<Holiday> list; // or two Lists with <variableHoliday> and <fixedHoliday>
    private List<Region> regions;
}

class Region{
    private List<Holiday> list; // or two Lists with <variableHoliday> and <fixedHoliday>
}

class variableHoliday {
    private String name;
    private int daysAfterEaster;
}
class fixedHoliday {
    private String name;
    private int day;
    private MonthName month; // while MonthName is an enum defined like the enum from XSD
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何轻松实现?

我认为jaxb尝试了一些东西,但在我看来(我是jaxb的初学者),由于地图不能像v一样写,因此难以实现这种XML结构.

San*_*shi 7

使用

xjc your_xsd_name -p packagename 
Run Code Online (Sandbox Code Playgroud)

要生成Pojos,xjc是jdk附带的xml java编译器.

生成类后,使用jaxb,如下所示

JAXB编组

    HDB hdb = new HDB(); 
    JAXBContext jaxbContext = JAXBContext.newInstance(HDB.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.marshal(hdb, file);
    jaxbMarshaller.marshal(hdb, System.out);
Run Code Online (Sandbox Code Playgroud)

JAXB Unmarshalling

    File file = new File("your xml file");
    JAXBContext jaxbContext = JAXBContext.newInstance(hdb.class);

    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    HDB hdb = (HDB) jaxbUnmarshaller.unmarshal(file);
    System.out.println(hdb);
Run Code Online (Sandbox Code Playgroud)

请访问以下链接以获取更多信息JAXB编组和解组