3

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

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

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

4

3 回答 3

4

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

此外,模式的事情是一个红鲱鱼。JAXB可以从 XML 模式生成 java 代码,但这只是在您模式的情况下方便。如果你不这样做,那么忽略那部分。您可以手动注释您的类模型,这非常容易。

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

于 2011-01-07T08:54:02.890 回答
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>

了解更多信息:

于 2011-01-07T14:14:03.777 回答
1

Maybe off topic: I've abandonded digester in favor of xstream. Maybe have a look

于 2011-01-07T09:39:29.390 回答