Десериализация текстовых элементов XML с атрибутами в XStream - PullRequest
1 голос
/ 15 июня 2010

По сути, я хочу сделать обратный ответ на этот вопрос .

Я получаю XML от пакетного сервиса геокодирования Microsoft Bing, и некоторые элементы выглядят следующим образом здесь ):

<DataflowJob>
    <Id>5bf10c37df944083b1879fbb0556e67e</Id>
    <Link role="self">https://spatial.virtualearth.net /REST/v1/dataflows/Geocode/5bf10c37df944083b1879fbb0556e67e</Link>
    <Link role="output" name="succeeded">https://spatial.virtualearth.net/REST/v1/dataflows/Geocode/5bf10c37df944083b1879fbb0556e67e/output/succeeded</Link>
    <Link role="output" name="failed">https://spatial.virtualearth.net/REST/v1/dataflows/Geocode/5bf10c37df944083b1879fbb0556e67e/output/failed</Link>
    <Description>Xml</Description>
    <Status>Completed</Status>
    ...
</DataflowJob>

Обратите внимание, что элементы <Link> имеют атрибуты, а также текстовое содержимое.Вот соответствующие классы POJO, к которым я пытаюсь десериализоваться:

class DataflowJob
{
    String Id;
    @XStreamImplicit
    List<Link> Links;
    String Description;
    Status Status;
    ...
}

class Link
{
    @XStreamAsAttribute
    Role role;
    @XStreamAsAttribute
    Name name;
    String url;
}

С моей текущей конфигурацией (классы имеют псевдонимы, атрибуты определяются автоматически и все такое в джазе), XStream должным образом десериализует Nameи атрибуты Role для элементов <Link>, но не сам текст ссылки.

Как заставить XStream десериализовать этот текст в поле String в объекте Link?

Мне не нужно вручную вставлять новые элементы вокруг текста ссылки * только для этого.


* например, заменить

<Link role="self">
    https://long/url/here
</Link>

на

<Link role="self">
    <url>https://long/url/here</url>
</Link>

1 Ответ

1 голос
/ 15 июня 2010

XStream не подходит для этого. XStream делает упор на сериализации / десериализации произвольных графов объектов Java в XML, а не на сериализации / десериализации произвольного XML.

Это будет тяжелый бой, подчиняющий XStream вашей воле. Я рекомендую использовать что-то лучше разработанное для этой задачи, например, JAXB (встроенный в JavaSE6) или JiBX.

...