XML到Java映射工具 – 带有映射描述符

我试图找到一个库,允许我将XML的内容放入JavaBean(像Digester,Jaxb,JIXB等),但我需要它是运行时(不是在编译时,或通过字节代码生成)和使用某种映射文件。

这个想法将类似于Hibernate的HBM映射文件,这是一种指定哪个XML元素进入哪个Java属性的方法。 我目前正在使用Digester,但我想要一些更简单的规则文件。

这也应该适用于1.4 JDK,因此注释不会真正做到(但我会考虑这些响应只是为了完整性)。

为了恢复,我需要一个运行时工具,它基于某种类型的XML描述符执行XML到Java,类似于此(取自JIXB),但在运行时(即将XML,Java类传递给输出对象和映射描述符) ):

替代文字

你知道这样的图书馆吗?

谢谢!

试试Castor。 它能够从DTD生成java代码(也可能从XSD生成)。 因此,您可以在运行时生成代码,然后进行编译。

BTW再次检查JAXB。 我相信它可以做同样的事情。

试试XSLT。

您可以输入XML文件并将其转换为另一个XML文件,该文件将作为Jaxb / XmlBeans / …的输入来填充您的bean。

XSL文件将是描述映射的“运行时”配置。

输入XML —(XSLT)—> Bean XML —(Jaxb)—> Java bean

Hibernate实际上对XML映射有一些支持。 有关更多信息,请参阅doc 。 我前段时间做了一个PoC,发现它有点缺乏文档。 我没有找到如何正确使用命名空间。

我们最终使用了Rome,因为我们只需要使用自定义命名空间解析/生成Atom提要。 但我不认为罗马会解决你的问题。 映射是用Java代码完成的,它在解析/生成RSS / Atom时受到限制……

祝你好运 ! 如果你最终使用Hibernate,我很想知道它是如何为你工作的!

Apache Commons Digester应该是一个值得考虑的有趣工具。 它可以满足您的需求,即获取XML并将其转换为Java bean。

EclipseLink JAXB(MOXy) (我是技术主管)有一个XML映射文件。 对于您的示例,映射文件将是:

binding.xml

                

领域模型

这将映射以下类:

 package blog.bindingfile; public class Customer { public Person person; public String street; public String city; public String state; public Integer zip; public String phone; } package blog.bindingfile; public class Person { public int customerNumber; public String firstName; public String lastName; } 

XML

来自以下XML:

    123456789 John Smith  12345 Happy Lane Plunk WA 98059 888.555.1234  

演示代码

如下所示:

 package blog.bindingfile; import java.io.File; import java.util.HashMap; import java.util.Map; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller; import org.eclipse.persistence.jaxb.JAXBContextFactory; public class Demo { public static void main(String[] args) throws Exception { Map properties = new HashMap(1); properties.put(JAXBContextFactory.ECLIPSELINK_OXM_XML_KEY, new File("binding.xml")); JAXBContext jc = JAXBContext.newInstance("blog.bindingfile", Customer.class.getClassLoader() , properties); Unmarshaller unmarshaller = jc.createUnmarshaller(); Customer customer = (Customer) unmarshaller.unmarshal(new File("input.xml")); Marshaller marshaller = jc.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(customer, System.out); } } 

jaxb.properties

要将MOXy用作JAXB实现,您需要在模型类中包含带有以下条目的jaxb.properties文件:

 javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

注意

此示例使用即将发布的EclipseLink 2.2版本中提供的简化引导。 有关使用EclipseLink 2.1的示例,请参阅: