2011-01-13 9 views
16

tengo el siguiente código:Problemas que fijan un nuevo valor de nodo en Java, dom, análisis XML

DocumentBuilder dBuilder = dbFactory_.newDocumentBuilder(); 
StringReader reader = new StringReader(s); 
InputSource inputSource = new InputSource(reader); 
Document doc_ = dBuilder.parse(inputSource); 

y luego me gustaría crear un nuevo elemento en ese nodo justo debajo del nodo raíz con este código :

Node node = doc_.createElement("New_Node"); 
node.setNodeValue("New_Node_value"); 
doc_.getDocumentElement().appendChild(node); 

El problema es que el nodo se crea y se anexa, pero el valor no se establece. No sé si simplemente no puedo ver el valor cuando miro mi xml si está oculto de alguna manera, pero no creo que sea así porque he intentado obtener el valor del nodo después de la llamada al nodo de creación y devuelve null. Soy nuevo en xml y dom y no sé dónde se almacena el valor del nuevo nodo. ¿Es como un atributo?

<New_Node value="New_Node_value" /> 

o lo hace poner valor aquí:

<New_Node> New_Node_value </New_Node> 

Cualquier ayuda sería muy apreciada,

Gracias, Josh

+0

¿Estás escribiendo el nuevo DOM de vuelta a un archivo? No veo ninguna referencia a la escritura, y te refieres a mirar el xml. –

+0

@ RD01 - Sí, lo estoy escribiendo de nuevo en un archivo. Supongo que mi pregunta principal en este momento es ¿qué hace node.setNodeValue() si no establece el texto o el atributo? – Grammin

Respuesta

35

El siguiente código:

Element node = doc_.createElement("New_Node"); 
node.setTextContent("This is the content"); //adds content 
node.setAttribute("attrib", "attrib_value"); //adds an attribute 

produce:

<New_Node attrib="attrib_value">This is the content</New_Node> 

la esperanza que esto aclare.

+0

Ah, eso aclara, entonces, ¿qué hace node.setNodeValue()? – Grammin

+7

'setNodeValue' varía según el tipo de nodo (Eche un vistazo a la tabla en javadocs: http://download.oracle.com/javase/6/docs/api/org/w3c/dom/Node.html). Si el nodo es un 'Elemento', entonces establecer nodeValue no hace nada, porque nodeValue es' null'. – dogbane

+0

¡Gracias por la aclaración! – Grammin

0
<New_Node value="New_Node_value" /> 

'valor' es un atributo de

New_Node

elemento, para entrar en DOM le sugiero que http://www.w3schools.com/htmldom/default.asp

+0

Sé que el valor de la instancia es un atributo, pero no sé qué valor tiene cuando configuro NoValor y por qué el código que intento no funciona. – Grammin

1

Para mayor claridad, cuando se crea nodos utilizan:

Attr x = doc.createAttribute(...); 
Comment x = doc.createComment(...); 
Element x = doc.createElement(...); // as @dogbane pointed out 
Text x = doc.createTextNode(...); 

lugar de utilizar el nodo genérico para lo que se obtiene de vuelta de cada método. Hará que su código sea más fácil de leer/depurar.

En segundo lugar, los métodos getNodeValue()/setNodeValue() funcionan de manera diferente dependiendo del tipo de Nodo que tenga. Consulte el resumen de Node class para referencia. Para un elemento, no puede usar estos métodos, aunque para un nodo de texto puede hacerlo.

Como señaló @dogbane, use setTextContent() para el texto entre las etiquetas de este elemento. Tenga en cuenta que esto destruirá cualquier elemento secundario existente.

0

Esta es otra solución, en mi caso, esta solución funciona porque la función setTextContent() no existe. Estoy trabajando con Google Web Toolkit (GWT) (es un framework de desarrollo Java) y me importan la librería XMLParser porque puedo usar DOM Parser.

import com.google.gwt.xml.client.XMLParser;

Document doc = XMLParser.createDocument();

Elemento node = doc.createElement ("New_Node"); node.appendChild (doc.createTextNode ("valor"));

doc.appendChild (nodo);

El resultado es:

< New_Node> valor < /New_Node>

Cuestiones relacionadas