Динамически создавать объекты Java для каждого дочернего узла XML? - PullRequest
3 голосов
/ 10 апреля 2011

В настоящее время я изучаю Java и как обращаться с данными XML.Я изучал, как использовать Java SAX для синтаксического анализа моих xml-данных в java-объектах. Этот XML-документ может измениться, и в него могут быть добавлены дополнительные дочерние элементы (например: День рождения, высота ...).Так что же является лучшей рекомендацией для обработки этого XML-документа?Мне сказали использовать такие объекты:

Object1.ID
Object1.Emp_Id
Object1.Emp_Name
...
Object2.ID
Object2.Emp_Id
Object2.Emp_Name

Если XML получил нового ребенка, такого как День рождения, приложение добавит его в объект следующим образом:

Object1.ID
Object1.Emp_Id
Object1.Emp_Name
Object1.Birthday

Можеткто-то указывает мне правильное направление, где я могу динамически создавать новые объекты, как в примере выше, в который я могу перетащить дочерние узлы?Так что, если дочерние узлы должны были измениться, мне не нужно указывать это напрямую?Извините за разговор с новичком, я не уверен, правильно ли я объясняю это.Я изучаю SAX и нашел этот учебник, но, похоже, не объясняю, что я хочу сделать: Отображение XML на объекты Java

Спасибо!

XMLфайл:

<?xml version = "1.0" ?>
<Employee-Detail>

<Employee>
<ID no="1">
<Emp_Id> E-001 </Emp_Id>
<Emp_Name> Vinod </Emp_Name>
<Emp_E-mail> Vinod1@yahoo.com </Emp_E-mail>
<Sex>Male</Sex>
<Age>25</Age>
</ID>
</Employee>

<Employee>
<ID no="2">
<Emp_Id> E-002 </Emp_Id>
<Emp_Name> Amit </Emp_Name>
<Emp_E-mail> Amit2@yahoo.com </Emp_E-mail>
<Sex>Male</Sex>
<Age>21</Age>
</ID>
</Employee>
</Employee-Detail>

Ответы [ 3 ]

4 голосов
/ 10 апреля 2011

Мне лично очень нравится использовать JAXB.

Вы можете взять этот образец XML и передать его генератору схемы XML (XSD). Затем возьмите XSD и сгенерируйте объекты Java с помощью инструмента XJC.

После того как ваши объекты Java сгенерированы, вы можете упорядочить (сохранить / экспортировать / записать) XML или распаковать (загрузить / импортировать / прочитать) его, используя классы Marshaller и Unmarshaller соответственно.

Раньше был онлайн-конвертер XML в XSD по адресу http://www.flame -ware.com / products / xml-2-xsd / , но в данный момент он не работает. Вы можете бесплатно загрузить экспресс-версию Visual Studio, чтобы выполнить то же самое.

Мне нравится этот урок для JAXB: http://download.oracle.com/javaee/5/tutorial/doc/bnbah.html

Обычно я использую SAX-разбор, только если я хочу получить полный контроль над всем, что анализируется во время анализа (почти никогда).

Мне не нравится использовать метод DOM, потому что он требует, чтобы весь документ XML был проанализирован, прежде чем вы на самом деле сможете что-то с ним сделать, и после того, как он проанализирован, вам нужно будет проделать дополнительную работу, чтобы сконфигурировать ваш анализатор / потребитель XML, чтобы знать что поля на самом деле делать с этим.

Что касается ваших динамических потомков, я бы просто включил в схему неограниченное количество объектов, представляющих пары ключ-значение. Это все равно сэкономит ваше время благодаря всему сгенерированному для вас коду.

Библиотека XmlBeans похожа на JAXB, но я предпочитаю последнюю, поскольку она была включена в базовый выпуск Java, а XmlBeans - нет.

1 голос
/ 10 апреля 2011

Другой вариант - XStream: http://x -stream.github.io / .Он менее гибок, чем JAXB, но имеет то преимущество, что вам не нужно много настроек.

В вашем случае вы просто создадите класс:

public class Employee {
  String Id;
  String EmpId; 
  ...
}

XStream xstream = new XStream();
xstream.alias("Employee", Employee.class);
xstream.useAttributeFor(Employee.class, "ID");
xstream.aliasField("no", Blog.class, "ID");
Employee e = (Employee)xstream.fromXML(xml);

ЭтоХотя это немного болезненно, если ваш XML не отображается точно на ваши объекты.

0 голосов
/ 10 апреля 2011

Есть два основных способа сделать это. Во-первых, вы можете определить классы Java, чьи имена отображаются на элементы XML. Вы можете сделать это вручную или использовать такой инструмент, как XmlBeans (есть много других). Оба варианта эквивалентны: вы должны знать кое-что о XML заранее.

Другой способ сделать это - не использовать выделенные классы, а использовать какой-то общий объект типа «узел дерева», который имеет свойство «имя», карту атрибутов и список дочерних элементов. Объектная модель документа (DOM) является стандартной версией этого, и фактически использование синтаксического анализатора DOM, который автоматически создает это дерево для вас, является стандартной альтернативой использованию SAX. Вы также можете создать свой собственный класс универсальных элементов, но вам, вероятно, следует сначала попробовать его с использованием DOM, чтобы увидеть, как он работает для вашего приложения.

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