使用Jakarta Digester还是JAXB?

时间:2011-01-07 08:36:48

标签: java jaxb apache-commons-digester

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

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

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

3 个答案:

答案 0 :(得分:4)

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

此外,架构的东西是红鲱鱼。 JAXB 可以从XML Schema生成java代码,但这对于拥有模式的情况来说非常方便。如果不这样做,则忽略该部分。您可以手动注释您的班级模型,这很容易。

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

答案 1 :(得分:3)

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>

有关详情:

答案 2 :(得分:1)

也许偏离主题:我放弃了消化器,转而支持xstream。也许看看