【问题标题】:Use Jakarta Digester or JAXB?使用 Jakarta Digester 还是 JAXB?
【发布时间】:2011-01-07 08:36:48
【问题描述】:

给定一个场景: 我有自己的系统对象结构。现在,我必须将多个 XML 源映射到我的 java 类。并且不需要将 Java 对象转换回 XML。

您对我使用 Digester 或 JAXB 有何建议?目前我倾向于使用 Digester,因为我可以为每个 XML 源指定 XML 路径到同一个对象方法调用,而且 Digester 似乎更易于维护。虽然 JAXB 对 marshal/unmarshal java 和 XML 有很好的设计,但我认为它太复杂了,每个 xml-java 映射都需要 xml 模式,对吧?

我认为 Digester 或 JAXB 都有自己的使命来适应不同的使用场景,所以需要你的建议来帮助我决定其中一个。非常感谢。

【问题讨论】:

    标签: java jaxb apache-commons-digester


    【解决方案1】:

    我认为您可能对 JAXB 有偏见。它可能很复杂,如果你选择这样做的话,但它也可能非常简单。例如,您可以将整个 XML 文档绑定到一个对象图上,只需要一个注释。

    另外,架构是一个红鲱鱼。 JAXB 可以从 XML Schema 生成 java 代码,但这只是为您拥有 Schema 的情况提供便利。如果你不这样做,那么忽略那部分。您可以手动注释您的类模型,非常简单。

    另一方面,Digester 更难维护(在我看来),因为您必须在类模型中添加路径表达式。

    【讨论】:

    • 非常感谢,我想我应该多花点时间在 JAXB 上。
    【解决方案2】:

    JAXB 的一个优点是它是一个具有多种实现的规范 (JSR-222):MetroEclipseLink MOXyJaxMe。这样就避免了厂商锁定的问题。

    基于 XPath 的映射

    EclipseLink JAXB (MOXy) 有一个扩展以支持基于 XPath 的映射(我是技术主管)。

    package blog.geocode;
    
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    import org.eclipse.persistence.oxm.annotations.XmlPath;
    
    @XmlRootElement(name="kml")
    @XmlType(propOrder={"country", "state", "city", "street", "postalCode"})
    public class Address {
    
        @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()")
        private String street;
    
        @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:LocalityName/text()")
        private String city;
    
        @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()")
        private String state;
    
        @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()")
        private String country;
    
        @XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()")
        private String postalCode;
    
    }
    

    多个 XML 源

    要将多个 XML 表示应用于对象模型,您可以利用 MOXy 的 XML 元数据。这是对 JAXB 标准的另一个扩展。示例文件如下所示:

    <?xml version="1.0"?>
    <xml-bindings
        xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
        package-name="blog.bindingfile">
        <xml-schema
            namespace="http://www.example.com/customer"
            element-form-default="QUALIFIED"/>
        <java-types>
            <java-type name="Customer">
                <xml-root-element/>
                <xml-type prop-order="firstName lastName address phoneNumbers"/>
                <java-attributes>
                    <xml-element java-attribute="firstName" name="first-name"/>
                    <xml-element java-attribute="lastName" name="last-name"/>
                    <xml-element java-attribute="phoneNumbers" name="phone-number"/>
                </java-attributes>
            </java-type>
            <java-type name="PhoneNumber">
                <java-attributes>
                    <xml-attribute java-attribute="type"/>
                    <xml-value java-attribute="number"/>
                </java-attributes>
            </java-type>
        </java-types>
    </xml-bindings>
    

    更多信息:

    【讨论】:

      【解决方案3】:

      也许题外话:我已经放弃了消化器,转而使用 xstream。也许看看

      【讨论】:

      • @Blaise:我真的不喜欢 XStream。它有问题、很慢,而且 API 很丑。不过,对于琐碎的应用程序很方便。
      • XStream 仅可用作 Data[Input|Output]Stream 的非二进制替代品。如果您最终需要自定义 XML,您很快就会希望自己坚持使用 Digester 或 JAXB。
      • 我实际上一直很喜欢 XStream 用于在文件中存储/检索对象图,并且已经在几个非平凡的产品中成功使用了它。它还可以read/write in a binary format
      猜你喜欢
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-25
      相关资源
      最近更新 更多