Как отобразить XML на объекты Java с помощью XPaths? - PullRequest
3 голосов
/ 27 сентября 2011

Учитывая пример XML:

<fooRoot>
  <bar>
    <lol>LOLOLOLOL</lol>
  </bar>
  <noob>
    <boon>
      <thisIsIt></thisIsIt>
    </boon>
  </noob>
</fooRoot>

Что должно быть сопоставлено с:

class MyFoo {
  String lol;
  String thisIsIt;
  Object somethingUnrelated;
}

Ограничения:

  • XML не следует преобразовывать, он предоставляется в виде разобранного объекта org.w3c.dom.Document.
  • Класс не отображает и не будет отображать 1: 1 в XML.
  • Мне интересно только сопоставить конкретные пути XML с конкретными полями объекта.

Решение моей мечты будет выглядеть так:

@XmlMapped
class MyFoo {

  @XmlElement("/fooRoot/bar/lol")
  String lol;

  @XmlElement("/noob/boon/thisIsIt")
  String thisIsIt;

  @XmlIgnore
  Object somethingUnrelated;
}

Есть ли что-нибудь подобное? То, что я обнаружил, требовало строгого отображения 1: 1 (например, JMX, JAXB) или ручной итерации по всем полям (например, SAX, Commons Digester.)

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

Ответы [ 3 ]

5 голосов
/ 27 сентября 2011

Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222 ) экспертная группа.

Вы можете сделать это с помощью MOXy:

@XmlRootElement(name="fooRoot")
class MyFoo {

  @XmlPath("bar/lol/text()")
  String lol;

  @XmlElement("noob/boon/thisIsIt/text()")
  String thisIsIt;

  @XmlTransient
  Object somethingUnrelated;
}

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

1 голос
/ 27 сентября 2011

Одним из вариантов может быть написание пользовательской аннотации, которая будет принимать выражение XPath в качестве входных данных и выполнять привязки.

1 голос
/ 27 сентября 2011

Попробуйте XStream . Это супер просто. Надеюсь, поможет! У меня нет времени на полный пример:)

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