Подтвердить что ты не робот

Как разобрать xml на java-объект?

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

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

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

4b9b3361

Ответ 1

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"));

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

Ответ 2

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

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

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

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

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

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

Счастливое кодирование!!

Ответ 3

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

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

Прошу прощения, чтобы сообщить вам, но:

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

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

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

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

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

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

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

@XmlElement(name="NAME")

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

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

Ответ 4

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

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