将XML解析/反序列化为JavaObjects
我开始了一个小型的新项目,我想从XML反序列化对象。
我创建了一个xsd:
http://pastebin.com/n1pwjRGX
和一个示例XML文件:
哪个应该使用xsd等。
那么我怎样才能将这些XML的反序列化转化为一个漂亮的Java对象结构呢?
Mabe喜欢:
class HDB { private HashMap map; } class Country { private List list; // or two Lists with and private List regions; } class Region{ private List list; // or two Lists with and } 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 }
任何想法如何轻松实现?
我认为jaxb尝试了一些东西,但在我看来(我是jaxb的初学者),由于地图不能像v一样写,因此难以实现这种XML结构。
使用
xjc your_xsd_name -p packagename
要生成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);
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);
请访问以下链接以获取更多信息JAXB编组和解组
JAXB – Java到XML绑定,是如上所述的指向,有效和高效的XML到POJO的方法,反之亦然。
加上必需的工具与JDK捆绑在一起只要求创建对象绑定所需的无错XSD / XSD集。
XJC
xjc:使用命令行args作为-p用于包名-d用于out dir等。详细信息可以在xjc手册页/参考在线页面找到 。
但是如果实现涉及多个xsds,那么更喜欢使用xjb(绑定文件)
来自oracle的XJBs 指南综合指南
一旦生成了绑定,您只需创建JAXBContext
,其中包含的类或包列表分隔为:
final JAXBContext context = JAXBContext.newInstance(Generated.class); final JAXBContext contextOnPackage = JAXBContext.newInstance("com.alpha.generated:com.beta.generated");
您可以选择提供类加载器以及最终的JAXBContext contextCustomClassLoader = JAXBContext.newInstnace(“..:..”,X.class.getClassLoader()); //这是为了更高级的用途。
解组
// source can be a file/InputStream/InputSource etc. Test obj = (Test)context.createUnMarshaller().unmarshal(source);
编组
Test test = gen.xml.package.ObjectFactory.createTest(); // Bunch of setters // gen.xml.package is generated package XJC will create ObjectFactory as well // sink can be File/OutputStream/Writer etc. context.createMarshaller().marshal(test, sink);
有关更多详细信息,请参阅Javadocs和JAXB规范。