parse - unmarshalling xml to java using jaxb example
JAXB-Ignorar elemento (4)
¿Hay alguna forma de simplemente ignorar un elemento del análisis de Jaxb? Tengo un archivo XML grande, y si pudiera ignorar uno de los elementos grandes y complejos, probablemente se analizaría mucho más rápido.
Sería aún mejor si ni siquiera pudiera validar el contenido del elemento y analizar el resto del documento, incluso si ese elemento no es correcto.
ej: esto solo debe generar Foo.element1 y Foo.element2
<foo>
<element1>I want this</element1>
<element2>And this</element2>
<bar>
<a>ALL of bar should be ignored</a>
<b>this also should be ignored</b>
<c>
<x>a lot of C that take time to process</x>
</c>
<c>
<x>a lot of C that take time to process</x>
</c>
<c>
<x>a lot of C that take time to process</x>
</c>
<c>
<x>a lot of C that take time to process</x>
</c>
</bar>
</foo>
Debe utilizar un analizador SAX y un controlador de documentos que "omita" de manera efectiva el nodo de no interés. No puedes evitar leer los bytes, pero al menos puedes evitar que desperdicien recursos adicionales.
Si su código requiere un árbol DOM, entonces básicamente utiliza un controlador de documentos SAX que genera nodos DOM, pero "omite" los nodos que no son de interés. Definitivamente menos conveniente que usar los generadores de árbol DOM provistos, pero una compensación decente es que no puede vivir con la sobrecarga de memoria extra de los nodos no deseados pero necesita el árbol DOM.
JAXB ignorará cualquier propiedad no asignada.
Implementación inteligente (al menos en EcliseLink JAXB (MOXy) , que dirijo). Cuando procesamos los contenidos a través de un analizador SAX (es decir, la entrada fue un SAXSource), cambiamos nuestro ContentHandler que es responsable de crear objetos a uno que no procesa esa sección (org.eclipse.persistence.oxm.unmapped). UnmappedContentHandler). Cuando estamos utilizando el procesamiento de los contenidos a través de un analizador StAX, avanzamos al siguiente evento asignado.
Si tiene una propiedad que corresponde a ese nodo, puede anotarla con @XmlTransient para convertirla en una propiedad sin asignar.
Suponiendo que su modelo JAXB se ve así:
@XmlRootElement(name="foo")
public class Foo {
@XmlElement(name="element1")
String element1;
@XmlElement(name="element2")
String element2;
@XmlElement(name="bar")
Bar bar;
}
luego, simplemente eliminando el campo de bar
de Foo
se saltará el elemento <bar/>
en el documento de entrada.
Como alternativa, anotó el campo con @XmlTransient
lugar de @XmlElement
, y también se omitirá.
Todo lo que necesita es un campo de marca como @XmlTransient (anotación @XmlTransient que debería ocultar los campos que no son necesarios). Ejemplo abajo
JavaEE:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "DeletedIds")
public class DeletedIds {
@XmlElement(name = "DeletedId")
private List<DeletedId> id;
@XmlTransient
@XmlElement(name = "success")
private String success;
//getters&setters
}
@XmlAccessorType(XmlAccessType.FIELD)
public class DeletedId {
private int id;
//getters&setters
}
Xml:
<DeletedIds>
<DeletedId>
<id>1</id>
</DeletedId>
<DeletedId>
<id>2</id>
</DeletedId>
</DeletedIds>