Маршаллинг XML-файла в Java pojo / объект домена - PullRequest
1 голос
/ 20 декабря 2011

У меня есть старая база данных Access, которая в основном представляет собой один плоский файл.Я хочу перенести данные в мое новое, удивительное, объектно-ориентированное приложение на основе гибернации.

Данные доступны в виде файла XML, и я хочу сопоставить их с тремя отдельными java pojos.Я планировал использовать JAXB для этого, в частности использовать аннотацию @xmlelement.Однако структура XML-файла не оптимальна, в моих программах я разбил данные на три разных объекта.

Поможет ли JAXB с этим?Нужно ли просто создавать Java Pojo на основе существующего файла схемы / XML (это не OO) с использованием Jaxb.Затем создайте apdater классы / слой, чтобы поместить данные в мои три pojos?Или я могу сопоставить прямо из XML-файла с 3 pojos с правильной конфигурации / аннотации?

Ответы [ 3 ]

4 голосов
/ 20 декабря 2011

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

Предполагается, что ваш XML-документ выглядит примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<rows>
    <row>
        <col1>a1</col1>
        <col2>b1</col2>
        <col3>c1</col3>
    </row>
    <row>
        <col1>a1</col1>
        <col2>b2</col2>
        <col3>c2</col3>
    </row>
</rows>

Вы можете использовать аннотацию @XmlPath от MOXy и сделать что-то подобное. EclipseLink также включает реализацию JPA :

Ряды

Вам понадобится создать объект Root для хранения всего:

package forum8577359;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Rows {

    @XmlElement(name="row")
    private List<A> rows;

}

A

Поскольку содержимое объектов A, B и C находится на одном уровне, вы можете использовать аннотацию @XmlPath MOXy и указать "." XPath. Это говорит MOXy, что объект и объект, на который он ссылается, происходят на одном уровне:

package forum8577359;

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlAccessorType(XmlAccessType.FIELD)
public class A {

    private String col1;

    @XmlPath(".")
    private B b;

}

B

Мы снова используем @XmlPath("."), чтобы отобразить отношения между B и C:

package forum8577359;

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlPath;

@XmlAccessorType(XmlAccessType.FIELD)
public class B {

    private String col2;

    @XmlPath(".")
    private C c;

}

C

package forum8577359;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class C {

    private String col3;

}

Демо

Следующий демонстрационный код можно использовать для запуска этого примера:

package forum8577359;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Rows.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum8577359/input.xml");
        Rows rows = (Rows) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(rows, System.out);
    }

}

jaxb.properties

Чтобы указать MOXy в качестве вашего JAXB-провайдера, вам нужно включить файл jaxb.properties в тот же пакет, что и классы вашего домена, со следующей записью:

javax.xml.bind.context.factory = org.eclipse.persistence.jaxb.JAXBContextFactory

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

1 голос
/ 20 декабря 2011

Обычно JAXB помогает. Даже если вы пишете классы и аннотации вручную, я думаю, что это займет меньше времени, чем анализ с использованием DOM API.

Более того, вы можете автоматически генерировать объекты-значения с помощью JAXB. Я думаю, что это подход, который вы должны попробовать. Сначала вы должны сгенерировать XSD-файл из вашего XML (если у вас его еще нет). Затем вы должны сгенерировать объекты значений на основе XSD. Затем просто проанализируйте файл. 2 строки кода и все готово.

1 голос
/ 20 декабря 2011

Не зная специфики ваших проблем ... это должно быть возможно, но, похоже, это может быть случай, когда вы захотите написать схему, используйте xjc для генерации объектов привязки, unmarshalк сгенерированным объектам привязки, а затем преобразовать их в объекты вашего домена в java (или напрямую использовать сгенерированные объекты, если применимо).

...