Как разобрать xml на java-объект?
У меня есть XML, который используется для настройки некоторых правил, он не имеет сложной структуры, но эта конфигурация используется в любой точке моей системы, поэтому я хочу проанализировать этот XML-объект Java и дизайн как однопользовательский режим, это любой хороший способ я могу использовать его для немедленного развязывания XML-объекта Java без написания многих кодов?
Я провел некоторое исследование в Google, и известный JAXB - это выбор, мое приложение - это всего лишь некоторые виды программных продуктов, которые читают правило, а затем следуют за материалами, JAXB можно использовать для веб-сервиса более широко, это соответствует моим проектам?
Если да, то самый важный вопрос: я использовал xjc для генерации исходного класса Java-объекта в соответствии с файлом xsd, после unmarshal я непосредственно получаю этот объект configurationType, нужно ли мне снова конвертировать (из классов JaxB в мои собственные java pojo object configuration), я вижу, что большинство кодеров делало это, но почему? потому что это некоторые данные, только из объекта, сгенерированного в JAXB, и копируют сам созданный объект POJO
Ответы
Ответ 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/
Ответ 5
Я нахожу, что jackson fasterxml
является хорошим выбором для serializing/deserializing
bean с XML.
Обратитесь: Как использовать spring для маршала и демонстрации xml?