Как создать граф объектов из XML-файла? - PullRequest
2 голосов
/ 07 октября 2010

У меня есть файл XML. Это может быть что-то вроде:

<person>
  <name>
    <firstname>Joni</firstname>
    <lastname>Smith</lastname>
  </name>
  <born year="1983" day="31" month="01">Finland</born>
  ... lots of elements ...
</person>

Моя цель - создать класс Person. Как я могу сделать это "автоматически"? Я думаю, что использовал какой-то плагин maven castor для создания довольно сложного графа объектов из файла XML без особых усилий. Тем не менее, я не могу вспомнить, что это за плагин, и действительно не могу вспомнить, как именно я его использовал. Я также очень рад узнать о других (возможно, лучших) инструментах, которые вы, возможно, знаете.

Ответы [ 4 ]

3 голосов
/ 08 октября 2010

Я согласен с использованием JAXB.

Начиная с XML-схемы (Создание классов из XML-схемы)

Вы можете использовать JAXB для генерации исходного кода Java из XML-схемы. Ниже приведены инструкции для этого с EclipseLink JAXB (MOXy):

Java SE 6 поставляется с компилятором Metro JAXB XJC, его можно найти в каталоге bin вашей установки JDK:

C:\Program Files\Java\jdk1.6.0_20\bin>xjc -d outputDir mySchema.xsd

Плагин Dali в Eclipse также имеет эту поддержку, см. Раздел о генерации класса JAXB:

Начиная с объектов

С вашей объектной моделью вы можете найти расширение отображения на основе XPath в MOXy JAXB полезным:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

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

    @XmlPath("name/firstname/text()")
    private String firstName;

    @XmlPath("name/lastname/text()")
    private String lastName;

    // ...
}

Может использоваться со следующим демонстрационным кодом для работы с вашим XML:

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Person person = (Person) unmarshaller.unmarshal(new File("input.xml"));

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

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

Для элемента "born" вам может пригодиться XmlAdapter JAXB:

1 голос
/ 07 октября 2010

Посмотрите на JAXB .Есть много инструментов, выберите тот, который наилучшим образом соответствует вашим потребностям.

1 голос
/ 07 октября 2010

Есть несколько инструментов. Digester , от Apache Commons, является одним из них.Довольно прост в использовании.

Обновление: Вот сравнение с другими инструментами, упомянутыми в других ответах (xmlbeans, jaxb).Таким образом, Digester - самый тонкий, способный просто загружать xml в объекты (например, особенно подходящий для «внутренних» конфигурационных файлов).Другие инструменты в большей степени ориентированы на полное сопоставление объектов xml (в обоих направлениях) и особенно полезны, когда задействованы схемы XML.

0 голосов
/ 08 октября 2010

Apache XMLBeans - это очень хороший способ генерации классов из XML, который поддерживает множество расширенных функций XML (таких как наследование типов), которые не поддерживаются в других инструментах.У XMLBeans есть инструмент командной строки, который используется для создания jar-файла, который вы затем включаете в проект, который содержит все классы bean-компонентов и фабрики для создания и использования XML-документов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...