Простое сопоставление / связывание Java XML с POJO?

10

Я пытаюсь найти самый простой способ сопоставить xml файл с простым старым Java-объектом.

Примечание. В моем примере xml не совсем совпадает с моим предполагаемым POJO.

///////// THE XML
<?xml version="1.0" encoding="UTF-8"?>
<Animal>
  <standardName>
    <Name>Cat</Name>
  </standardName>
  <standardVersion>
    <VersionIdentifier>V02.00</VersionIdentifier>
  </standardVersion>
</Animal>


////// THE INTENDED POJO
class Animal
{
 private String name;
 private String versionIdentifier;
}

Обычный JAXB (с аннотациями) не будет работать, поскольку аннотации имени JAXM Element не позволяют мне указывать вложенные элементы. (т.е. standardName/Name).

Я посмотрел на Jibx, но это кажется слишком сложным, и никаких полных примеров не предусмотрено для того, что я хочу делать.

Кастро кажется, что он сможет делать то, что я хочу (используя файлы сопоставления), но мне интересно, есть ли другие возможные решения. (Возможно, это позволит мне пропускать файлы сопоставления и просто разрешить мне указывать все в аннотациях).

Спасибо

  • 0
    Как дополнительное примечание, отображение / привязка должны работать в обоих направлениях.
Теги:
jibx

4 ответа

3
Лучший ответ

Эта статья может вам помочь... вам нужно только знать xpath http://onjava.com/onjava/2007/09/07/schema-less-java-xml-data-binding-with-vtd-xml.html

  • 2
    Похоже, что это, вероятно, будет лучшим выбором (не имея файлов отображения или аннотаций), а просто имея некоторую форму методов транслятора, использующих xpath и, возможно, vtdxml или dom.
  • 1
    будьте осторожны с digestor, это не полный анализатор и может быть очень медленным для больших документов XmL
4

EclipseLink JAXB (MOXy) позволяет выполнять сопоставление на основе маршрутов, которое вы ищете:

@XmlRootElement 
class Animal 
{ 
 @XmlPath("standardName/Name/text()")
 private String name; 

 @XmlPath("standardVersion/VersionIdentifier/text()");
 private String versionIdentifier; 
} 

Для получения дополнительной информации см.

EclipseLink также позволяет указывать метаданные с помощью внешнего файла конфигурации:

  • 0
    EclipseLink JAXB (MOXy) ссылка перенаправляет на 404
  • 0
    Текущая ссылка eclipse.org/eclipselink/#moxy
3

Jakarta Commons Digester должен делать то, что вы хотите.

В качестве альтернативы я бы рекомендовал написать класс преобразования, который использует XPath для извлечения элементов из XML.

2

Я считаю JiBX лучшим из связки (JAXB, Castor, XMLBeans и т.д.), особенно потому, что я предпочитаю файлы сопоставления над аннотациями. По общему признанию, он имеет приличную кривую обучения, но на веб-сайте есть много хороших примеров. Вы, должно быть, пропустили tutorial.

Если вы идете только одним способом (XML → POJO), вы можете использовать Digester.

Боковой комментарий: я предпочитаю сопоставлять файлы через аннотации, потому что аннотации:

  • загромождать код (особенно при использовании аннотаций от нескольких продуктов)
  • проблемы смешивания (XML, база данных и т.д. в доменном слое)
  • может связывать только одно представление XML (или базы данных, веб-службы и т.д.)
  • 0
    Я прочитал учебник, но если я что-то пропустил ... кажется, требуется пара дополнительных шагов (по сравнению с Castro), то есть требования для запуска bindgen. (Что на самом деле не так легко объяснить на сайте). Похоже на чрезмерное усложнение необходимости запуска bindgen для ваших файлов сопоставления, прежде чем вы сможете их использовать. Существуют ли простые учебные пособия / фрагменты? т. е. учитывая этот файл XML, этот файл сопоставления XML и этот фрагмент кода, вы получите этот экземпляр POJO.
  • 0
    EclipseLink JAXB (MOXy) также предлагает файл сопоставления. Это дает вам свободу использовать аннотации (стандартные JAXB плюс расширения) или файл сопоставления.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню