Java unmarshlling XML для объекта, которые являются динамическими - PullRequest
4 голосов
/ 01 сентября 2011

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

Рабочий процесс будет выглядеть так: чтение из XML создает класс для каждого объекта с динамическим набором атрибутов и / или создает часть отображения ORM для этих объектов, а затем все манипуляции извлекают / сохраняют в БД или, возможно, будут использовать какое-то решение NoSQL, например MongoDB.

Ответы [ 2 ]

3 голосов
/ 01 сентября 2011

Примечание: Я - EclipseLink JAXB (MOXy) , и член JAXB 2 ( JSR-222 * 1008) *) экспертная группа.

<Ч />

Ознакомьтесь со следующим примером EclipseLink. Он демонстрирует, как использовать динамические свойства в реализациях JPA и JAXB:

<Ч />

Вариант № 1 - Статические объекты с динамическими свойствами

MOXy имеет расширение @XmlVirtualAccessMethods, которое позволяет отображать записи на карте в XML. Это позволяет вам добавлять свойства в статический класс. В приведенном ниже примере класс Customer имеет свойство «настоящее» имя и может иметь множество «виртуальных» свойств.

package blog.metadatasource.refresh;

import java.util.*;
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlVirtualAccessMethods;

@XmlRootElement
@XmlType(propOrder={"firstName", "lastName", "address"})
@XmlVirtualAccessMethods
public class Customer {

    private String name;
    private Map<String, Object> extensions = new HashMap<String, Object>();

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Object get(String key) {
        return extensions.get(key);
    }

    public void set(String key, Object value) {
        extensions.put(key, value);
    }

}

Виртуальные свойства определяются через метаданные XML MOXy. В приведенном ниже примере мы добавим два свойства: middleName и shippingAddress.

<?xml version="1.0"?>
<xml-bindings
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
    package-name="blog.metadatasource.refresh">
    <java-types>
        <java-type name="Customer">
            <java-attributes>
                <xml-element
                    java-attribute="middleName"
                    name="middle-name"
                    type="java.lang.String"/>
                <xml-element
                    java-attribute="shippingAddress"
                    name="shipping-address"
                    type="blog.metadatasource.multiple.Address"/>
            </java-attributes>
        </java-type>
    </java-types>
</xml-bindings>

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

<Ч />

Вариант № 2 - Динамические объекты

MOXy также предлагает полные динамические объектные модели:

DynamicJAXBContext jaxbContext = DynamicJAXBContextFactory.createContextFromXSD(xsdInputStream, null, null, null);

Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(inputStream);

DynamicEntity address = jaxbContext.newDynamicEntity("org.example.Address");
address.set(street, "123 A Street");
address.set(city, "Any Town");
customer.set("address", address);

Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.marshal(customer, System.out);

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

2 голосов
/ 01 сентября 2011

Итак, вы в основном пытаетесь сделать POJO (простые старые объекты Java) с использованием файлов XML? Они как классы данных, верно?

Я большой поклонник XStream , который действительно прост в использовании и отлично работает, если вам не нужна проверка. Я использовал Castor , когда требовалась проверка по схеме. Я просто использовал XStream для сохранения объекта в XML-файл, а затем я могу прочитать его откуда угодно, даже если я изменю значения данных, связанные с объектом (что, я думаю, вы подразумеваете под «динамическим набором атрибутов», не так ли?).

...