Использовать Jakarta Digester или JAXB? - PullRequest
3 голосов
/ 07 января 2011

Учитывая сценарий: у меня есть собственная структура объектов системы.Теперь существует более одного источника XML, который я должен сопоставить с классами Java.И нет необходимости преобразовывать Java-объект обратно в XML.

Что вы мне предлагаете использовать Digester или JAXB?В настоящее время я предпочитаю использовать Digester, потому что я могу указать путь XML для каждого источника XML к одному и тому же вызову метода объекта, и Digester, кажется, легче поддерживать.Хотя JAXB имеет хороший дизайн для маршалирования / демаршализации Java и XML, но я думаю, что это слишком сложно, XML-схема необходима для каждого отображения XML-Java, верно?

Я думаю, что и у Digester, или у JAXB своя миссия - соответствовать разным сценариям использования, поэтому вам нужен ваш совет, чтобы помочь мне выбрать один из них.Большое спасибо.

Ответы [ 3 ]

4 голосов
/ 07 января 2011

Я думаю, что у вас может быть искаженное представление о JAXB. Это может быть сложным, если вы решите сделать это, но это также может быть чрезвычайно просто. Например, вы можете привязать весь XML-документ к графу объектов только с одной аннотацией.

Кроме того, в схеме есть красная сельдь. JAXB может генерировать Java-код из XML-схемы, но это просто удобство для случаев, когда у вас есть схема. Если вы этого не сделаете, то игнорируйте эту часть. Вы можете аннотировать модель своего класса вручную, это очень просто.

С другой стороны, Digester сложнее поддерживать (на мой взгляд), так как вы должны разбираться с добавлением выражений пути в дополнение к модели вашего класса.

3 голосов
/ 07 января 2011

Преимущество JAXB в том, что это спецификация (JSR-222) с несколькими реализациями: Metro , EclipseLink MOXy , JaxMe .Это позволяет избежать проблемы блокировки поставщика.

Отображение на основе 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 к объектной модели, вы можете использовать метаданные XML MOXy.Это еще одно расширение стандарта 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>

Для получения дополнительной информации:

1 голос
/ 07 января 2011

Может быть, не по теме: я отказался от метантенка в пользу xstream.Может быть, посмотрите

...