【问题标题】:Java object to XML schemaJava 对象到 XML 模式
【发布时间】:2010-09-20 17:38:15
【问题描述】:

如果您有一个 Java 对象和一个 XML 模式 (XSD),那么获取该对象并将其转换为符合该模式的 xml 文件的最佳方法是什么。对象和架构彼此不知道(因为 Java 类不是从架构创建的)。

例如,在类中,可能有一个整数字段“totalCountValue”,它对应于 xsd 文件中名为“countTotal”的元素。有没有一种方法可以创建一个映射,它会说“如果对象包含一个 int totalCountValue,则创建一个名为 'countTotal' 的元素并将其放入 XML”。 类似地,对象中可能存在应该忽略的字段,或者对象中应该对应多个 XML 元素的列表。

我查看了 XStream,但没有看到任何(明显的)方法。是否有其他 XML 库可以简化此任务?

【问题讨论】:

标签: java xml object


【解决方案1】:

我相信这可以通过 JAXB 使用它的注释来实现。我通常发现使用 XJC 从 JAXB(在您的架构中定义)生成对象比映射现有 Java 对象以匹配我的架构要容易得多。 YMMV。

【讨论】:

    【解决方案2】:

    我正在使用 XStream 对 Object 进行 XML 序列化。对于这个序列化程序,您没有发现什么“明显”?一旦你掌握了它的窍门,它就非常简单了。

    在您提供的示例中,您可能会遇到这样的情况:

    ...
    XStream xstream = new XStream(new DomDriver());
    
    xstream.alias("myclass", MyClass.class);
    xstream.aliasField("countTotal", MyClass.class, "totalCountValue");
    
    String xml = xstream.toXML(this);
    ...
    

    对于这个示例类:

    class MyClass {
         private int totalCountValue;
    
         public MyClass() {
         }
    } 
    

    如果您发现一些比这更简单或更“酷”的序列化程序,请与我们分享。我也在寻找改变...

    查看 XStream 迷你教程here

    【讨论】:

    • 因为您的 Xstream 注释必须维护以符合 XSD。您对架构的冗余定义。
    【解决方案3】:

    我使用一个名为JiBx 的Java 库来完成这项工作。您需要编写一个映射文件(在 XML 中)来描述您希望 XML Schema 元素如何映射到 java 对象。有几个生成器工具可以帮助自动化该过程。另外它真的很快。

    【讨论】:

      【解决方案4】:

      我尝试了大多数建议的库,以查看哪个最适合我的需求。我还尝试了一个这里没有提到但由同事建议的库,它是一个名为 Woodstox 的 StAX 实现。

      诚然,我对所有这些库的测试并不完整,但出于问题中提到的目的,我发现 Woodstox 是最好的。它是编组速度最快的(在我的测试中,它比 XStream 高出大约 30~40%)。它也相当容易使用和控制。

      这种方法的缺点是创建的 XML(因为它是由我定义的)需要通过验证器运行,以确保它与架构正确。

      【讨论】:

        【解决方案5】:

        您可以使用来自 Apache Commons 的名为 Betwixt 的库。如果您需要往返,它可以将 bean 映射到 XML,然后再返回。

        【讨论】:

          【解决方案6】:

          看看JDOM

          【讨论】:

            【解决方案7】:

            我会说 JAXB 或 Castor。我发现 Castor 更易于使用且更可靠,但 JAXB 是标准

            【讨论】:

              猜你喜欢
              • 2012-09-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-12
              • 1970-01-01
              相关资源
              最近更新 更多