JAXB-аннотация, когда корневой XML-узел содержит PCData - PullRequest
2 голосов
/ 03 марта 2011

Я пытаюсь использовать данные стороннего веб-сервиса. К сожалению, веб-сервис возвращает данные в необычном формате XML. Вот пример данных, которые я получаю от сервиса:

    <?xml version="1.0" encoding="utf-8"?>
    <string xmlns="http://mynamespace">(-76.4844131, 39.1031567, 0.0000000)
         (-76.4871168, 39.1031567, 0.0000000)
         (-76.4875889, 39.1042890, 0.0000000)
         (-76.4905500, 39.1052881, 0.0000000)
    </string>

Вместо корневого узла, содержащего список элементов путевой точки (широта, долгота, высота), содержимое корневого узла представляет собой большое строковое значение. Хотя я мог просто проанализировать строку, я надеялся использовать JAXB (поскольку я использую JERSEY для вызовов службы) для преобразования этого возвращенного XML в Java POCO.

В идеале было бы неплохо преобразовать большое строковое тело корневого узла в класс POCO со списком путевых точек, но я полагаю, что для этого потребуется пользовательская десериализация XML вне JAXB.

Но я бы с удовольствием что-то вроде этого, если бы я мог использовать JAXB:

@XmlRootElement(name="string", namespace="http://mynamespace")
public class Route {
  private String _wayPoints;

  @ ???? 
  public String getWayPoints() { returns _waypoints; }
  public void setWayPoints(String wayPoints) { _wayPoints = wayPoints; }
}

К сожалению, я не видел в JAXB никакого способа сказать маршаллеру, что одно из моих свойств должно быть содержимым либо корневого элемента, либо какого-либо другого элемента.

В идеале было бы неплохо, если бы я мог комментировать свою собственность чем-то вроде:

@XmlElementContent(ElementName="string")

и это приведет к маршализации / демаршализации содержимого моего свойства wayPoint в содержимое (или внутренний текст) моего корневого элемента.

У кого-нибудь была похожая проблема? Есть ли способ сделать это с JAXB? Или мне следует просто проанализировать строку и / или написать собственный десериализатор XML.

Спасибо!

1 Ответ

4 голосов
/ 03 марта 2011

Вы можете использовать @ XmlValue

@XmlValue
public String getWayPoints() { returns _waypoints; }
...