将XML转换为Java对象

22

如何将XML转换为Java对象?

我不需要对应的表示,但希望从XML中提取特定数据并填充Java对象。我查看了XStream,但不太喜欢整个“下移,上移”之类的东西。我更喜欢编写转换器时的DOM对象。


Xstream看起来不错,唯一的问题是我更喜欢使用HierarchicalStreamReader的JDOM实现... 我想我可以进行强制转换,但这似乎有点奇怪... 有没有一种方法可以使用转换器但是使用JDOM阅读器呢? - DD.
7个回答

24

如果您拥有一个XML模式,JAXB是个不错的选择 - 它是JDK的一部分。运行例如 xjc -p foo myschema.xsd 可以生成Java类。

要读取一个XML文件并返回由xjc工具生成的对象:

    JAXBContext context = JAXBContext.newInstance(FooObj.class);
    Unmarshaller unMarshaller = context.createUnmarshaller();
    FooObj param = (FooObj) unMarshaller.unmarshal(new FileInputStream("Foo.xml"));

如果你只想将XML文档的某些部分转换为对象,那么你可以做类似的事情。例如,你应该能够像上面所做的那样给JAXB提供DOM文档的一部分,而不是整个文件。


1
+1 - 当从Java类开始时,您还可以使用JAXB(JSR-222)实现。 您只需要在想要与默认值不同的XML表示不同的位置添加注释:http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html - bdoughan

12

我知道每个人都喜欢像JAXB之类的自动解决方案,但我建议手工编写javax.xml.bind.Marshallerjavax.xml.bind.Unmarshaller实现,以便在不必要地填充永久代空间的情况下获得所需的精确结果。 使用JDOM解析XML并使用XPath将值映射到Java对象中。 这可能需要一些工作,但您将获得完全符合要求的内容。


你为什么提到PermGen? - Abdull
3
您认为由JAXB生成的.class字节码会去哪里?随着JDK8的推出,这可能已经不重要了:没有永久代了。这个答案是我五年前写的。 - duffymo
唉...与读取json相比,这感觉像是一种巨大的过早优化。 - Michael Haefele

8

6

我想从XML转换为对象。此外,我的XML文档非常大,我只想将一小部分数据解析到我的对象中。 - DD.
1
JAXB/MOXy还支持XML到对象的转换。您只需要映射所需内容,其他内容将被忽略。MOXy的基于XPath的映射可帮助您保持较小的对象模型。请参见http://bdoughan.blogspot.com/2010/07/xpath-based-mapping.html。 - bdoughan

4
你可以使用Castor方便地将XML转换为Java,然后再转回来。
借助Castor,您可以:
1.轻松转换:简单的Marshaller和Unmarshaller使得将XML转换为Java以及反向转换变得非常容易。
2.映射:可以创建映射文件以限制从XML到Java的数据转换量。

Castor映射文件易于理解和操作,但是需要注意以下几点:
  • 只有当值为XML属性时,才能将其作为构造函数参数传递(不支持将元素作为构造函数参数)
  • 无法直接写入私有字段
因此,如果您的领域实现采用DDD方法(没有setter,而是使用构造函数),并且输入的XML存储信息为元素,则无法使用Castor。
- omnomnom

3

我喜欢 Simple,并且发现它非常容易使用。但是它确实只能产生类似的表示形式,所以也许不完全符合你的要求。

如果你正在寻找类似于DOM的解决方案,也许JDom会更适合。


2

我不确定这是否符合您的要求,但您可以使用类似XMLBeans的工具将XML绑定到Java对象上。我之前在一家公司使用过它。不幸的是,那是一个现成的系统,我只需要操作对象,而不需要生成包含它们的库。另外,我不确定没有XSD文件时它是否能正常工作(您没有提到是否有XSD文件)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接