Как разобрать XML в Java-объект?

У меня есть XML, который используется для настройки некоторых правил, он не имеет сложной структуры, но эта конфигурация используется в любой точке моей системы, поэтому я хочу проанализировать этот XML для объекта Java и проектировать его как одноэлементный режим. можно использовать его для демаршалирования XML в объект Java напрямую без написания большого количества кодов?

Я провел небольшое исследование в Google, и я знал, что JAXB - это выбор. Мое приложение - это всего лишь инструментальная программа, которая читает правила, а затем следит за вещами. JAXB можно было бы использовать для веб-сервиса более широко, это подходит для моих проектов?

Если да, то самый важный вопрос: я использовал xjc для генерации исходного класса java-объекта в соответствии с xsd-файлом, после демаршала я получу непосредственно этот объект configurationType, нужно ли мне снова конвертировать (из классов JaxB в мой принадлежащий java pojo-объект конфигурация), я вижу, большинство кодер сделал это, но почему? потому что они представляют собой некоторые данные, просто из объекта, сгенерированного в JAXB и скопированного в созданный нами объект POJO

5 ответов

JAXB является идеальным решением. Но вам не обязательно нужны xsd и xjc для этого. Чаще всего у вас нет xsd, но вы знаете, какой у вас xml. Просто проанализируйте свой XML, например,

<customer id="100">
    <age>29</age>
    <name>mkyong</name>
</customer>

Создайте необходимый класс (ы) модели:

@XmlRootElement
public class Customer {

    String name;
    int age;
    int id;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    @XmlElement
    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    @XmlAttribute
    public void setId(int id) {
        this.id = id;
    }

}

Попробуй разобрать:

JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(new File("C:\\file.xml"));

Проверьте результаты, исправьте ошибки!

Одна вещь, которую действительно важно понять, учитывая, что у вас есть XML-файл:

<customer id="100">
    <Age>29</Age>
    <NAME>mkyong</NAME>
</customer>

Мне жаль сообщать вам, но:

@XmlElement
public void setAge(int age) {
    this.age = age;
}

вам не поможет, так как он пытается найти "возраст" вместо имени элемента "возраст" из XML.

Я рекомендую вам вручную указать имя элемента, совпадающее с именем в файле XML:

@XmlElement(name="Age")
public void setAge(int age) {
    this.age = age;
}

И если у вас есть, например:

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

Это означает, что он будет использовать Java-бины по умолчанию, и в это время, если вы укажете, что вы не должны устанавливать другой

@XmlElement(name="NAME")

аннотация над методом установки для элемента <NAME>..</NAME> он не скажет, что не может быть двух элементов на одну переменную.

Я надеюсь, что это помогает.

Для выполнения Unmarshall с использованием JAXB:

1) Конвертировать данный XML в XSD(самостоятельно или онлайн-конвертером),

2) Создайте проект JAXB в Eclipse,

3) Создайте файл XSD и вставьте в него преобразованный контент XSD.

4) Щелкните правой кнопкой мыши по **XSD-файлу -> Generate -> JAXB Classes-> следуйте инструкциям (это создаст все несущественные файлы.java в src, т. Е. Одну информацию о пакете, фабрику объектов и класс pojo),

5) Создайте другой файл.java в src для выполнения операции unmarshall и запустите его.

Удачного кодирования!

JAXB - надежный выбор, поскольку он плавно отображает классы xml на java. Но есть и другие доступные фреймворки, вот один из них:

https://code.google.com/p/xmappr/

Я нахожу jackson fasterxml один хороший выбор для serializing/deserializing бин с XML.

Обратитесь: Как использовать пружину для маршала и демаршала XML?

Другие вопросы по тегам