2011-01-10 15 views
5

Tengo el siguiente código que prácticamente copié de here. Pero el problema es que mis nodos de texto no contienen ningún texto, solo tienen atributos. Así que tengo comoCómo eliminar #text de mi análisis de nodo en Java dom xml sintáctico

<Random name="Katie" num="5"></Random> 

y estoy usando este código para analizarlo:

private void listNodes(Node node, String indent) 
    { 
    String nodeName = node.getNodeName(); 
    System.out.println(indent + " Node is: " + nodeName); 

    if(node instanceof Element && node.hasAttributes()) 
    { 
     System.out.println(indent + "Attributes are: "); 
     NamedNodeMap attrs = node.getAttributes(); 
     for (int i = 0; i < attrs.getLength(); i++) 
     { 
     Attr attribute = (Attr) attrs.item(i); 
     System.out.println(indent + attribute.getName() + "=" + attribute.getValue()); 
     } 
    } 

    NodeList list = node.getChildNodes(); 

    if (list.getLength() > 0) 
    { 
     for (int i = 0; i < list.getLength(); i++) 
     { 
     listNodes(list.item(i), indent + " "); 
     } 
    } 
    } 

Por alguna razón mi texto vacío nodos todos dicen

nodo es: #text

¿Alguien sabe cómo omitir el texto del nodo vacío al analizar el archivo xml?

Gracias,

Josh

+0

También puede eliminar todos los nodos de texto vacíos: http://stackoverflow.com/a/16285664/1812434 –

Respuesta

8

Con la validación DTD que puede tener el analizador suprimir automáticamente el espacio en blanco entre los elementos. Sin embargo, para modificar su implementación específica, puede probar los nodos de texto e ignorarlos si están vacíos.

private void listNodes(Node node, String indent) 
{ 
    if (node instanceof Text) { 
     String value = node.getNodeValue().trim(); 
     if (value.equals("")) { 
      return; 
     } 
    } 

    String nodeName = node.getNodeName(); 
    System.out.println(indent + " Node is: " + nodeName); 
    ... 
+0

gracias por la excelente respuesta! – Grammin

5

'#text' es el resultado de la invocación de método getNodeName() en node.These vacío nodos vacíos pueden ser identificados usando 'XPath' y puede ser eliminado.

XPathFactory xpathFactory = XPathFactory.newInstance(); 
// XPath to find empty text nodes. 
XPathExpression xpathExp = xpathFactory.newXPath().compile(
    "//text()[normalize-space(.) = '']"); 
NodeList emptyTextNodes = (NodeList) 
    xpathExp.evaluate(doc, XPathConstants.NODESET); 
// Remove each empty text node from document. 
for (int i = 0; i < emptyTextNodes.getLength(); i++) { 
    Node emptyTextNode = emptyTextNodes.item(i); 
emptyTextNode.getParentNode().removeChild(emptyTextNode); 
} 

'#text' se genera como resultado de espacios libres.

6

También puede utilizar Node.getNodeType() método para este propósito

Node node; 
if(node.getNodeType == node.ELEMENT_NODE) { 
    //Your code inside this 
} 
Cuestiones relacionadas