2009-08-18 10 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); 

    } 

Je m'attends à ce qu'il imprime 0.15, mais il imprime null. Des idées?Java XML analyse en utilisant DOM pour obtenir nodevalue

Edit: Ce fait le tour

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

Répondre

6

Essayez l'extraire de l'élément plutôt que du Noeud:

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 - Je viens edited à la sortie du nodeValue au lieu de l'instance de texte! – karim79

11

C'est parce que an element in fact has no nodeValue. Au lieu de cela, il a un nœud de texte comme un enfant, qui a le nodeValue que vous voulez.

En résumé, vous voulez getNodeValue() sur le premier enfant du noeud d'élément.

Parfois, l'élément contient plusieurs noeuds de texte, car ils ont une taille maximale, dans ce cas, vous aurez besoin de quelque chose á la présente, à partir de la page liée précédemment:

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

Bonne explication, et merci beaucoup pour l'excellente fonction. Fonctionne comme un champion. –

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

Si la Le noeud n'a pas d'autres descendants imbriqués, alors que n.getTextContent() fonctionne plutôt 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

Vous pouvez utiliser jOOX comme encapsuleur pour DOM standard, afin de simplifier votre code.

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

Vous pourriez aussi avoir Joox convertir cette valeur à doubler, par exemple:

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