Obteniendo valor de texto del nodo XML con DOM Java

No puedo recuperar el valor del texto con Node.getNodeValue() , Node.getFirstChild().getNodeValue() o con Node.getTextContent() .

Mi XML es como

  foobar foobar2  

Y estoy intentando obtener un valor de etiqueta (la recuperación de elementos que no son de texto funciona bien). Mi código Java suena como

 Document doc = db.parse(new File(args[0])); Node n = doc.getFirstChild(); NodeList nl = n.getChildNodes(); Node an,an2; for (int i=0; i < nl.getLength(); i++) { an = nl.item(i); if(an.getNodeType()==Node.ELEMENT_NODE) { NodeList nl2 = an.getChildNodes(); for(int i2=0; i2<nl2.getLength(); i2++) { an2 = nl2.item(i2); // DEBUG PRINTS System.out.println(an2.getNodeName() + ": type (" + an2.getNodeType() + "):"); if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getTextContent()); if(an2.hasChildNodes()) System.out.println(an2.getFirstChild().getNodeValue()); System.out.println(an2.getTextContent()); System.out.println(an2.getNodeValue()); } } } 

Imprime

 tag type (1): tag1 tag1 tag1 null #text type (3): _blank line_ _blank line_ ... 

Gracias por la ayuda.

an2.getNodeName() el resultado de an2.getNodeName() también para fines de depuración. Supongo que el código de rastreo de tu árbol no se está arrastrando a los nodos que crees que es. Esa sospecha se ve reforzada por la falta de comprobación de los nombres de nodo en su código.

Aparte de eso, javadoc para Node define ” getNodeValue ()” para devolver nulo para los nodos de tipo Elemento. Por lo tanto, realmente debería usar getTextContent (). No estoy seguro de por qué eso no le daría el texto que desea.

Tal vez iterar los hijos de su nodo de etiqueta y ver qué tipos hay?

Intenté este código y me funciona:

 String xml = "\n" + " foobar\n" + " foobar2\n" + ""; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); ByteArrayInputStream bis = new ByteArrayInputStream(xml.getBytes()); Document doc = db.parse(bis); Node n = doc.getFirstChild(); NodeList nl = n.getChildNodes(); Node an,an2; for (int i=0; i < nl.getLength(); i++) { an = nl.item(i); if(an.getNodeType()==Node.ELEMENT_NODE) { NodeList nl2 = an.getChildNodes(); for(int i2=0; i2 

La salida fue:

 #text: type (3): foobar foobar #text: type (3): foobar2 foobar2 

Si su XML es bastante profundo, puede considerar usar XPath, que viene con su JRE, para que pueda acceder a los contenidos mucho más fácilmente usando:

 String text = xp.evaluate("//add[@job='351']/tag[position()=1]/text()", document.getDocumentElement()); 

Ejemplo completo:

 import static org.junit.Assert.assertEquals; import java.io.StringReader; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathFactory; import org.junit.Before; import org.junit.Test; import org.w3c.dom.Document; import org.xml.sax.InputSource; public class XPathTest { private Document document; @Before public void setup() throws Exception { String xml = "foobarfoobar2"; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); document = db.parse(new InputSource(new StringReader(xml))); } @Test public void testXPath() throws Exception { XPathFactory xpf = XPathFactory.newInstance(); XPath xp = xpf.newXPath(); String text = xp.evaluate("//add[@job='351']/tag[position()=1]/text()", document.getDocumentElement()); assertEquals("foobar", text); } } 

Yo uso un java muy antiguo. Jdk 1.4.08 y yo tuvimos el mismo problema. La clase Node para mí no tenía el método getTextContent() . Tuve que usar Node.getFirstChild().getNodeValue() lugar de Node.getNodeValue() para obtener el valor del nodo. Esto arreglado para mí.

Si está abierto a vtd-xml , que se destaca tanto por el rendimiento como por la eficiencia de la memoria , a continuación se muestra el código para hacer lo que está buscando … tanto en navegación manual como manual … el código general es mucho más conciso y fácil de usar. entender …

 import com.ximpleware.*; public class queryText { public static void main(String[] s) throws VTDException{ VTDGen vg = new VTDGen(); if (!vg.parseFile("input.xml", true)) return; VTDNav vn = vg.getNav(); AutoPilot ap = new AutoPilot(vn); // first manually navigate if(vn.toElement(VTDNav.FC,"tag")){ int i= vn.getText(); if (i!=-1){ System.out.println("text ===>"+vn.toString(i)); } if (vn.toElement(VTDNav.NS,"tag")){ i=vn.getText(); System.out.println("text ===>"+vn.toString(i)); } } // second version use XPath ap.selectXPath("/add/tag/text()"); int i=0; while((i=ap.evalXPath())!= -1){ System.out.println("text node ====>"+vn.toString(i)); } } }