2011-07-27 3 views
5

Comencé a usar VTD (creo que VTD-XML) en Java, y para las lecturas de XPath es excelente. Donde estoy abordando un problema ahora es con la inserción de datos. Digamos que estoy haciendo lo siguiente:VTD-XML en Java - Buscar índice después de XMLModifier.insertAfterElement

VTDNav nav = preExistingGen.getNav(); 
AutoPilot pilot = new AutoPilot(nav); 
pilot.selectXPath("/Something/SomethingElse"); 
if (pilot.evalXPath() != -1) { 
    XMLModifier modifier = new XMLModifier(nav); 
    modifier.insertAfterElement("<some>content</some>"); 
} 

Lo que había asumido era esto era una actualización en tiempo real, lo que se reflejaría en el VTDNav. Parece que mi entendimiento es incorrecto, ya que simplemente insertar el contenido del elemento no le hace nada al navegador (si imprimo el VTDNav, aún contiene mi xml original). La única forma en que puedo ver cómo funciona el nuevo xml es emitirlo desde XMLModifier.

modifier.outputAndReparse(); // Gives me a new VTDNav with the new content 

¿Faltan algo aquí? ¿Hay una manera más fácil de hacer esto? Quería poder insertar el nuevo contenido y obtener inmediatamente el nuevo índice. Mi código existente (que usa las clases DOM estándar) tiene un montón de insertos y actualizaciones, y también necesito saber dónde estaba el último elemento insertado en el documento. Tener que mostrarAndReparse() cada vez y luego encontrar el elemento insertado (que tal vez no pueda garantizar) no parece una solución plausible.

+1

Parece que no hay una gran solución que pueda encontrar en ninguna parte. Como mi código trata sobre la creación de un nuevo documento, adopto un enfoque híbrido: uso de vtd para hacer las lecturas en mi documento de entrada y uso DOM para hacer las escrituras en mi documento de salida. – jpcamara

+0

+1, y también decidí usar VTD para leer y navegar el documento, pero uso DOM para modificarlo. –

Respuesta

0
modifier.remove(): 

en el archivo de texto almacenado no de xpaths, val así que para cada xpath genera un nuevo archivo de salida xxx.xml. cuando usas los datos previos del modificador xml junto con los datos actuales, escribirá en un archivo xxx.xml para eliminar los datos anteriores y solo para los cambios de datos de xpath actuales escribe en el nuevo archivo xxx.xml, para eso usa el modificador.remove ();

xm2.output(new FileOutputStream("/home/cupola-hadoop-project/TotalEnvironment/document/link/"+j+"101new.xml")); 
xm2.remove(); 

y gire el ciclo deseado.

+1

Lo siento, no entiendo esta respuesta. Además, al leer la descripción de XMLModifier.remove() se obtiene "Elimina el contenido del documento XML maestro". Necesito el documento completo, más el nuevo contenido para ser navegable, tal vez no estaba claro en ese punto. ¡Gracias por la entrada! – jpcamara

2

Creo que la respuesta es planificar cuidadosamente su modificación y el acceso subsiguiente a nuevos contenidos. Si inserta el nuevo contenido e intenta acceder al nuevo contenido inmediatamente después, insertAndParse() es el camino a seguir. Pero como pueden ver, es bastante lento debido al repaso. Mi sugerencia es que planifiques tanto como insertar todo de una vez, luego llamar al repaso solo una vez, será mucho más eficiente de esta manera.

El espíritu es que VTD-XML no intenta ser DOM, tiene sus propias fortalezas y debilidades ... y esta es una de las debilidades, pero puedes evitarlo ... Y cuando intentes para fusionar varios archivos xml, vtd-xml ciertamente brillará ...

Además, si etiquetas esta pregunta con vtd-xml, podré encontrarla mucho más fácil.

Cuestiones relacionadas