【问题标题】:XML to Java mapping tool - with mapping descriptorXML 到 Java 映射工具 - 带有映射描述符
【发布时间】:2011-05-22 02:38:26
【问题描述】:

我正在尝试找到一个库,它允许我将 XML 的内容放入 JavaBean(例如 Digester、Jaxb、JIXB 等)但我需要它是运行时的(不是在编译时,也不是通过字节码代)并使用某种映射文件。

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

这也应该适用于 1.4 JDK,因此注释不会真正起作用(但出于完整性考虑,我会考虑这样的响应)。

要恢复,我需要一个运行时工具,它基于某种 XML 描述符将 XML 转换为 Java,类似于这样(取自 JIXB)但在运行时(即传递 XML、Java 类以输出对象和映射描述符):

你知道这样的图书馆吗?

谢谢!

【问题讨论】:

    标签: java xml mapping


    【解决方案1】:

    试试 XSLT。

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

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

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

    【讨论】:

      【解决方案2】:

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

      顺便说一句,再次检查 JAXB。我相信它也可以做到。

      【讨论】:

      • 我已经有了 Java 类和 XML 文件。无法改变这一点,所以我需要将它们与一个描述符粘合在一起,上面写着“这个到这里”。生成东西并不是一个真正的选择。感谢您的回答!
      • 我想我会试试 Castor 的“映射模式”。似乎完全不需要任何代码生成就可以做我需要的事情。再次感谢。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 正如我在问题中所说的,我目前正在使用 Digester,但需要一种方法来简化其“规则”,包括了解 Digester 如何工作、如何从其内部堆栈中放置和删除元素等。我需要一些“愚蠢”的东西:像i.imgur.com/XMYEC.gif这样的映射
        【解决方案5】:

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

        binding.xml

        <xml-bindings
            xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
            package-name="blog.bindingfile">
            <java-types>
                <java-type name="Customer">
                    <xml-root-element/>
                    <xml-type prop-order="person street city state zip phone"/>
                </java-type>
                <java-type name="Person">
                    <xml-type prop-order="customerNumber firstName lastName"/>
                    <java-attributes>
                        <xml-element java-attribute="customerNumber" name="cust-num"/>
                        <xml-element java-attribute="firstName" name="first-name"/>
                        <xml-element java-attribute="lastName" name="last-name"/>
                    </java-attributes>
                </java-type>
            </java-types>
        </xml-bindings>
        

        领域模型

        这将映射以下类:

        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:

        <?xml version="1.0" encoding="UTF-8"?>
        <customer>
            <person>
                <cust-num>123456789</cust-num>
                <first-name>John</first-name>
                <last-name>Smith</last-name>
            </person>
            <street>12345 Happy Lane</street>
            <city>Plunk</city>
            <state>WA</state>
            <zip>98059</zip>
            <phone>888.555.1234</phone>
        </customer>
        

        演示代码

        如下所示:

        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<String, Object> properties = new HashMap<String, Object>(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 的示例,请参阅:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-09-07
          • 1970-01-01
          • 2018-06-18
          • 1970-01-01
          • 1970-01-01
          • 2017-05-02
          • 2013-05-04
          • 2010-12-10
          相关资源
          最近更新 更多