Как разобрать 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. Но есть и другие доступные фреймворки, вот один из них:
Я нахожу jackson fasterxml
один хороший выбор для serializing/deserializing
бин с XML.
Обратитесь: Как использовать пружину для маршала и демаршала XML?