【问题标题】:What is the best way to convert a java object to xml with open source apis [closed]使用开源api将java对象转换为xml的最佳方法是什么[关闭]
【发布时间】:2009-04-10 00:25:52
【问题描述】:

我想知道将 java 对象转换为 xml 的最佳或最广泛使用的 api 是什么。我对这个主题相当陌生。是否可以进行某种 api 调用来传入对象并返回 xml?还是需要通过提取对象值来手动构造文档时更加繁琐?

我一直在阅读有关 xerces、sax 和 jaxb 的文章。我想沿着这条开源路线继续前进。

谢谢!

【问题讨论】:

    标签: java xml serialization


    【解决方案1】:

    JAXB 绝对是解决方案。

    为什么?嗯,它在 JDK 6 中,所以你永远不会发现它无人维护。

    它使用 Java 注释来为类、方法和字段声明与 XML 相关的属性。

    Tutorial 1

    Tutorial 2

    注意:JAXB 还使您能够轻松地“解组”XML 数据 (之前是从 Java 对象实例中编组的)返回 到对象实例。

    JAXB 的另一个优点是:它被其他 Java 相关的支持 技术,例如 JAX-RS(一种 Java RESTful API,可用 作为 Java EE 6 的一部分)。 JAX-RS 可以服务和接收 JAXB 动态对象,无需编组/解组它们。 您可能想查看Netbeans,其中包含 对 JAX-RS 的开箱即用支持。请阅读 this tutorial 了解入门。

    编辑:

    编组/解组“随机”(或外部)Java 对象,JAXB 提供了相当简单的可能性:可以声明一个 XmlAdapter 并将现有的 Java 类“包装”为与 JAXB 兼容。 此类 XmlAdapter 的使用是通过使用 @XmlJavaTypeAdapter-annotation 完成的。

    【讨论】:

    • 这个包似乎旨在将现有的 XML 文件映射到 java 代码,而不是快速而肮脏的“随机”java 对象的持久性。 ...我认为这是一件有用的事情,但并不完全符合要求。
    • 请看我回答的编辑部分
    • JAXB 用于绑定,而不是序列化。使用 java.beans.XMLEncoder 进行简单的序列化。
    • JAXB 也是一个规范,因此有多种实现方式:Metro (jaxb.dev.java.net)、MOXy (eclipse.org/eclipselink/moxy.php) 等。
    • @ivan_ivanovich_ivanoff 您好,您的Tutorial 2 链接似乎已损坏。你能修好吗?谢谢
    【解决方案2】:

    你可能想看看 XStream:http://x-stream.github.io

    【讨论】:

    【解决方案3】:

    Java 6 提供了一个将带注释的 Java 对象转换为 XML 的 API。以下代码展示了如何将带注释的对象转换为 XML 字符串

    final JAXBElement o = new ObjectFactory().createElement(new Type());
    
    final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller();
    
    // 如果您希望结果更易于阅读,请执行此操作。
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    m.marshal(o, System.out);

    您可以通过添加架构验证来进一步扩展它(注意非常慢,但对调试很有用)

    final JAXBElement o = new ObjectFactory().createElement(new Type());
    
    final Marshaller m = JAXBContext.newInstance(Type.class).createMarshaller();
    最终架构架构 = SchemaFactory.newInstance(
      "http://www.w3.org/2001/XMLSchema").newSchema(
      getClass().getResource("/META-INF/wsdl/schema.xsd"));
    m.setSchema(模式);
    m.marshal(o, System.out);

    如果 Type 是已定义的元素,则不需要对 JAXBElement 进行类型转换。 (即有一个注解@XmlRootElement)

    【讨论】:

      【解决方案4】:

      java.beans.XMLEncoder 和 java.beans.XMLDecoder 呢?

      http://www.rgagnon.com/javadetails/java-0470.html 的示例

      再见。

      【讨论】:

        【解决方案5】:

        对于决定使用 JAXB 的任何人,请确保缓存 JAXBContext。众所周知,JAXBContext.newInstance 非常昂贵。我记录了一个在日志记录中使用到 xml 的转换并且没有缓存 JAXBContext.newInstance 的案例,当 20 个并发用户调用时,它会导致高达 5 秒的性能开销。

        http://app-inf.blogspot.com/2012/10/performance-tuning-logging-right-way.html

        这并不是要阻止任何使用 JAXB 的人。缓存 JAXBContext 后,性能非常好,如上面的链接所述。

        【讨论】:

          【解决方案6】:

          XMLBeans 是另一个,类似于 JAXB。我有一段时间没有看 JAXB,当我这样做时,它与 XMLBeans 相比相当糟糕,但那是几年前的事了(我更喜欢使用 JDK 中的东西而不是 3rd 方的东西,但我仍然使用XMLBeans 直到今天)。

          【讨论】:

            【解决方案7】:

            这个领域有很多开源框架。但是,Simple 顾名思义,是迄今为止执行序列化的最简单方法。看看Tutorial。另一个特点是它可以执行多态序列化,这意味着它不像 JAXB 那样受限。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-10-07
              • 1970-01-01
              • 1970-01-01
              • 2012-12-22
              相关资源
              最近更新 更多