2010-07-18 109 views
22

将XML转换为Java对象的最佳方式是什么?将XML转换为Java对象

我不希望喜欢像表示法,但想从XML中提取某些数据并填充Java对象。我看了一下XStream,但并不喜欢整个“下移,上移”类型的东西。写转换器时,我宁愿像DOM模型...

+0

西河看起来很好的唯一的事情是,我宁愿用JDOM实现HierarchicalStreamReader的工作....我想我可以投,但这个好像有点怪怪的....有一种使用转换器但使用JDOM阅读器的方法? – 2010-07-18 16:16:07

回答

11

我知道每个人都喜欢像JAXB和这样的自动解决方案,但我建议你手工编码javax.xml.bind.Marshallerjavax.xml.bind.Unmarshaller实现,达到您想要的东西而不必填满你的烫发根空间。使用JDOM解析XML并使用XPath将值映射到Java对象。做一次这将会是一些工作,但是你将会拥有你所需要的,而不是更多。

+0

为什么你提到PermGen? – Abdull 2015-10-29 12:02:27

+3

您认为JAXB生成的.class字节代码在哪里?可能与JDK8无关:没有更多的烫发。五年前我写了这个答案。 – duffymo 2015-10-29 12:03:39

2

我不能完全肯定,如果这是你在找什么,但你可以使用像XMLBeans将XML绑定到Java对象。我必须在以前的雇主中使用它。不幸的是,这是一个现有的系统,我只需要操作这些对象,而不必生成包含它们的库。另外,我不确定如果没有XSD,它的工作效果如何(您没有提及是否有XSD)。

3

我喜欢Simple,发现它很容易使用。它确实产生了类似的代表性,虽然可能不是你想要的。

如果您正在寻找类似DOM的解决方案,那么JDom可能适合。

21

如果你有一个XML模式,JAXB很好 - 作为JDK的一部分。通过运行例如Java生成Java类xjc -p foo myschema.xsd

读取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 – 2012-12-05 11:28:04

3

您可以使用Castor将XML方便地转换为Java并返回。

Castor数据,你可以

  1. 易于转换:一个简单的Marshaller和Unmarshaller的使XML转换为Java和背部非常容易。
  2. 映射:可以创建一个映射文件来限制要从XML转换回Java的数据量。
+0

Castor映射文件非常简单且直观: *只有当它是xml属性时才能将值作为构造函数参数传递(不支持元素作为构造函数参数) *不能直接写入私有字段 所以如果您在DDD方法中实现了域(no取而代之的是setter和构造函数)并输入xml存储信息作为元素,所以没有办法使用castor – 2011-09-29 12:08:53

5

JAXB是将对象转换为XML的最佳方式,而MOXy是最好的JAXB实现。

  • JAXB is standard,包含在Java SE 6
  • 标准的XML绑定技术,JAX-WS,JAX-RS,和SCA
  • 简单的运行时

莫西提供以下扩展名:

+0

我想从XML到对象的另一种方式。另外我的XML文档非常大,我只想将一小部分数据解析到我的对象中。 – 2010-07-20 23:58:55

+1

JAXB/MOXy还支持XML到对象。你只需要映射你想要的其他内容将被忽略。基于MOXy的基于XPath的映射可以帮助您保留一个小对象模型。请参阅http://bdoughan.blogspot.com/2010/07/xpath-based-mapping.html – 2010-07-21 13:07:42