我开始了一个小型的新项目,我想从XML反序列化对象.
我创建了一个xsd:
和一个示例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结构.
使用
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编组和解组