java xml xml-parsing sax jaxb2

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:

  1. ¿Cuál es la posible solución para este Requisito? (Excepto el análisis DOM , ya que XML contnet es muy grande)

  2. ¿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 .