Introducir un nodo en un xml con DOM

andrew
26 de Septiembre del 2003
Hola muy buenas;

Tengo un problema, a ver si alguien me saca de la duda;


Tengo un xml y deseo añadirle nuevos nodos pongamos de ejemplo este:
<?xml version="1.0" encoding="UTF-8" ?>
- <portfolio>
- <stock>
<symbol>SUNW</symbol>
<name>Sun Microsystems</name>
<price>17.1</price>
</stock>
- <stock>
<symbol>AOL</symbol>
<name>America Online</name>
<price>51.05</price>
</stock>
- <stock>
<symbol>IBM</symbol>
<name>International Business Machines</name>
<price>116.10</price>
</stock>
- <stock>
<symbol>MOT</symbol>
<name>MOTOROLA</name>
<price>15.20</price>
</stock>
</portfolio>

quiero añadirle un nodo "stock"... total q hago un
Document doc = getDocument(file);
me hago el nodo hijo nuevo q quiero meter con un cloneNode de el nodo "stock" y cambiando los valores respectivos... hasta hay bien...

Despues hago un appendChild del hijo clonado (en adelante hijo dolly) y bien... me hago un metodo q me saca todo el documento y me sale bien, todo esta en su sitio, incluso dolly...

Mi problema es q aunq el documento esta bien, el fichero xml no se me actualiza... Hago la cutrada de hacerme un string con todo el documento y escribirlo como cualquier otro archivo (con sus streamwriters y tal...) y funciona pero me gustaria saber si hay alguna manera de q el Document me actualice el archivo xml el solo... ya q esta bien hecho q me escriba el archivo...

Existe alguna manera?

rafa
26 de Septiembre del 2003
Los cambios que realizas los haces en el DOM, que esta almacenado en memoria. Una vez realizas esos cambios debes escribir el DOM de nuevo en el fichero

mport javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;

TransformerFactory transformerFactory =
TransformerFactory.newInstance();

Transformer serializer = transformerFactory.newTransformer();

serializer.transform( new DOMSource( document ),
new StreamResult( new FileOutputStream( "intro1.xml" ) ) );

donde document es tu documento XML y "intro1.xml" cambialo por el nombre de tu xml.

PD: Para crear nuevos nodos la manera de clonar no es la mas eficiente: que pasaria si no tuvieras ningun nodo desde el cual clonar??

Lo mejor es esto:

Element nuevoStock= document.createElement("stock"); // esto te crea una nueva rama en el DOM <stock> ... </stock>

añadir todo lo que quieras a este elemento Element con appenchild

Element newSymbol = document.createElement("symbol"); // <symbol> </symbol>
newSymbol.appendchild(document.createTextNode("MOT")); // Añadir el texto al elemento symbol <symbol>MOT</symbol>

nuevoStock.appendChild(newSymbol); // <stock><symbol>MOT</symbol></stock>

Espero que te sirva de ayuda

andrew
26 de Septiembre del 2003
Muchisimas gracias