java - JAXB Desasignación de un subconjunto de contenido XML desconocido
xml-parsing sax (2)
Tengo un requerimiento para unmarshall
un subconjunto de contenido XML
desconocido, con ese objeto desorganizado, necesito modificar algunos contenidos y volver a vincular el mismo contenido XML (subconjunto) con el XML original.
Ejemplo de entrada XML:
<Message>
<x>
</x>
<y>
</y>
<z>
</z>
<!-- Need to unmarshall this content to "Content" - java Object -->
<Content>
<Name>Robin</Name>
<Role>SM</Role>
<Status>Active</Status>
</Content>
.....
</Message>
Es necesario destrabar la etiqueta <Content>
solo, manteniendo la otra parte XML como la misma. Necesita modificar los elementos en la etiqueta <Content>
y enlazar la parte XML modificada con el original como se muestra a continuación:
XML de salida esperado:
<Message>
<x>
</x>
<y>
</y>
<z>
</z>
<!-- Need to unmarshall this content to "Content" - java Object -->
<Content>
<Name>Robin_123</Name>
<Role>Senior Member</Role>
<Status>1</Status>
</Content>
.....
</Message>
Mis preguntas:
¿Cuál es la posible solución para este Requisito? (Excepto el análisis
DOM
, ya que XML contnet es muy grande)¿Hay alguna opción para hacer esto en
JAXB2.0
?
Por favor, brinde sus sugerencias sobre esto.
Considere reducir el tamaño de su documento de origen con la API de StAX .
Para la muestra dada, este código crea un documento DOM con un elemento raíz del elemento Content
:
class ContentFinder implements StreamFilter {
private boolean capture = false;
@Override public boolean accept(XMLStreamReader xml) {
if (xml.isStartElement() && "Content".equals(xml.getLocalName())) {
capture = true;
} else if (xml.isEndElement() && "Content".equals(xml.getLocalName())) {
capture = false;
return true;
}
return capture;
}
}
XMLInputFactory inFactory = XMLInputFactory.newFactory();
XMLStreamReader reader = inFactory.createXMLStreamReader(inputStream);
reader = inFactory.createFilteredReader(reader, new ContentFinder());
Source src = new StAXSource(reader);
DOMResult res = new DOMResult();
TransformerFactory.newInstance().newTransformer().transform(src, res);
Document doc = (Document) res.getNode();
Esto se puede pasar a JAXB como DOMSource .
Se pueden usar técnicas similares al reescribir el XML en la salida.
JAXB no parece aceptar un StreamSource
directamente, al menos en la implementación de Oracle 1.7.
Puede anotar una propiedad Object
en su clase con @XmlAnyElement
y de forma predeterminada, el contenido no @XmlAnyElement
se capturará como un nodo DOM. Si especifica un DomHandler
en @XmlAnyElement
entonces puede controlar el formato. Aquí hay un enlace a un ejemplo donde el contenido se guarda como una String
.