Deserializar elementos de texto XML con atributos en xstream
-
27-09-2019 - |
Pregunta
Básicamente, quiero hacer lo contrario de esta pregunta .
Me estoy XML del servicio por lotes Geocode Bing de Microsoft, y algunos de los elementos de aspecto (escalfados de aquí ):
<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>
Tenga en cuenta que los elementos <Link>
tienen atributos, así como el contenido del texto. Aquí están las clases POJO pertinentes que estoy tratando de deserializar a:
class DataflowJob
{
String Id;
@XStreamImplicit
List<Link> Links;
String Description;
Status Status;
...
}
class Link
{
@XStreamAsAttribute
Role role;
@XStreamAsAttribute
Name name;
String url;
}
Con mi configuración actual (clases son alias, atributos detectada automáticamente, y todo eso), xstream deserializa adecuadamente los atributos Name
y Role
sobre los elementos <Link>
, pero no el propio enlace de texto real.
¿Cómo llego xstream deserializar ese texto en un campo String
en un objeto Link
?
Yo no quiero tener que insertar manualmente nuevos elementos de todo el texto del enlace * sólo para esto.
* por ejemplo., Reemplace
<Link role="self">
https://long/url/here
</Link>
con
<Link role="self">
<url>https://long/url/here</url>
</Link>
Solución
xstream no es una herramienta adecuada para ello. El énfasis de xstream está en serializar / deserializar objetos Java arbitraria gráficos a XML, en lugar de serializar / deserializar XML arbitrario.
Va a ser una pelea cuesta arriba flexión xstream a su voluntad. Recomiendo el uso de algo mejor diseñado para esta tarea, como JAXB (integrado en JavaSE6) o JiBX.