2009-08-18 7 views
12
try { 
     String data = "<a><b c='d' e='f'>0.15</b></a>"; 
     DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory 
       .newInstance(); 
     DocumentBuilder documentBuilder = documentBuilderFactory 
       .newDocumentBuilder(); 
     InputSource is = new InputSource(); 
     is.setCharacterStream(new StringReader(data)); 
     Document document = documentBuilder.parse(is); 

     NodeList nl = document.getElementsByTagName("b"); 
     Node n = (Node) nl.item(0); 
     System.out.println(n.getNodeValue()); 
    } catch (Exception e) { 
     System.out.println("Exception " + e); 

    } 

Espero imprimir 0,15, pero imprime nulo. ¿Algunas ideas?Java Análisis XML usando DOM para obtener el valor de nodo

Editar: Este hizo el truco

 if (n.hasChildNodes()) 
      System.out.println(n.getFirstChild().getNodeValue()); 
     else 
      System.out.println(n.getNodeValue()); 

Respuesta

6

Trate extrayéndolo del elemento en lugar de desde el Nodo:

try { 
    String data = "<a><b c='d' e='f'>0.15</b></a>"; 
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory 
      .newInstance(); 
    DocumentBuilder documentBuilder = documentBuilderFactory 
      .newDocumentBuilder(); 
    InputSource is = new InputSource(); 
    is.setCharacterStream(new StringReader(data)); 
    Document document = documentBuilder.parse(is); 

    NodeList nl = document.getElementsByTagName("b"); 
    Element el = (Element) nl.item(0); 
    Text elText = (Text) el.getFirstChild(); 
    String theValue = elText.getNodeValue(); 
    System.out.println(theValue); 
} catch (Exception e) { 
    System.out.println("Exception " + e); 
} 
+0

@mkal - Me acaba de editar para dar salida al nodeValue en lugar de la instancia de texto! – karim79

11

Eso es porque an element in fact has no nodeValue. En su lugar, tiene un nodo de texto como un niño, que tiene el nodeValue que desea.

En resumen, querrá getNodeValue() en el primer hijo del elemento nodo.

A veces el elemento contiene múltiples nodos de texto, ya que tienen un tamaño máximo, en cuyo caso se necesitará algo á la presente, desde la página vinculado anteriormente:

public static String getNodeValue(Node node) { 
    StringBuffer buf = new StringBuffer(); 
    NodeList children = node.getChildNodes(); 
    for (int i = 0; i < children.getLength(); i++) { 
     Node textChild = children.item(i); 
     if (textChild.getNodeType() != Node.TEXT_NODE) { 
      System.err.println("Mixed content! Skipping child element " + textChild.getNodeName()); 
      continue; 
     } 
     buf.append(textChild.getNodeValue()); 
    } 
    return buf.toString(); 
} 
+0

Buena explicación, y muchas gracias por la excelente función. Funciona como un campeón. –

3
System.out.println(n.getFirstChild().getNodeValue()); 
1

Si el nodo no tiene más descendientes anidados, que n.getTextContent() funciona bastante bien.

2
private String getTextValue(Element element, String string) { 
    String textVal = null; 
    NodeList nl = element.getElementsByTagName(string); 
    if(nl != null && nl.getLength() > 0) { 
     Element el = (Element)nl.item(0); 
     textVal = el.getFirstChild().getNodeValue(); 
    } 

    return textVal; 

} 
1

Puede usar jOOX como envoltura para DOM estándar, para simplificar su código.

String data = "<a><b c='d' e='f'>0.15</b></a>"; 
String value = $(data).find("b").text(); 

Usted también podría haber Joox convertir ese valor a duplicar, por ejemplo:

Double value = $(data).find("b").text(Double.class); 
Cuestiones relacionadas