2011-07-22 2 views
0

Je suis en train d'analyser un document XML en utilisant DOM en Java. Les données ressemble à ceci:Java DOM - Exception du pointeur NULL

<nodes totalCount="48" count="10"> 
    <node type="A" id="83" label="label1"> 
    <record>new</record> 
    <createTime>12345</createTime> 
    </node> 
    <node type="A" id="77" label="label2"> 
    <record>new</record> 
    <createTime>4567</createTime> 
    </node> 
</nodes> 

Ceci est la partie pertinente de mon code que j'utilise pour analyser:

Document doc = dBuilder.parse(new InputSource(reader)); 
doc.getDocumentElement().normalize(); 
Log.w(TAG, "Dom Root element :" + doc.getDocumentElement().getNodeName()); 
NodeList nList = doc.getElementsByTagName("node"); 

for (int temp = 0; temp < nList.getLength();temp++) { 
     Element element = (Element) nList.item(temp); 
     NodeList time = element.getElementsByTagName("createTime"); 
     Element line = (Element) time.item(0); 
     String value =getDataFromElement(line); 
     Log.w(TAG, "Create time: " + value); 
} 

Et mon méthode getDataFromElement est

public static String getDataFromElement(Element e) { 
     Node child = e.getFirstChild(); 
     if (child instanceof CharacterData) { 
      CharacterData cd = (CharacterData) child; 
      return cd.getData(); 
     } 
    return ""; 
} 

Mon le problème est, il donne null pointer exception après l'impression de la première valeur de createTime à

getDataFromElement() méthode

Quelqu'un peut-il m'aider à diagnostiquer ce problème?

+0

Pour votre information iam utilisant javax.xml.parsers ... et org.w3c.dom .... classes. – TechnocraT

+2

Si vous respectiez un peu plus le temps des gens, vous nous donneriez un SSCCE et n'auriez pas eu à l'expliquer. –

+1

quelle ligne renvoie exactement cette exception? – alexblum

Répondre

0

Utilisez try/catch pour éliminer les nœuds indésirables:

[email protected]:/tmp$ cat so.xml ElementTest.java; java ElementTest 
<?xml version="1.0" encoding="UTF-8"?> 
<nodes totalCount="48" count="10"> 
<node type="A" id="83" label="label1"> 
<record>new</record> 
<createTime>12345</createTime> 
<node type="B"> 
</node> 
</node> 
<node type="A" id="77" label="label2"> 
<record>new</record> 
<createTime>4567</createTime> 
</node> 
</nodes> 
import org.w3c.dom.*; 
import javax.xml.parsers.*; 
import java.io.*; 
import org.xml.sax.*; 
public class ElementTest { 
public static void main(String args[]) throws Exception { 
    InputStream reader = ElementTest.class.getResourceAsStream("so.xml"); 
    DocumentBuilder dBuilder = DocumentBuilderFactory.newInstance(
    ).newDocumentBuilder(); 
    Document doc = dBuilder.parse(new InputSource(reader)); 
    doc.getDocumentElement().normalize(); 
    System.out.println("Dom Root element :" + doc.getDocumentElement().getNodeName()); 
    NodeList nList = doc.getElementsByTagName("node"); 
    for (int temp = 0; temp < nList.getLength();temp++) { 
    Element element = (Element) nList.item(temp); 
    NodeList time = element.getElementsByTagName("createTime"); 
    Element line = (Element) time.item(0); 
    try { 
    String value =getDataFromElement(line); 
    System.out.println("Create time: " + value); 
    } catch (Exception problem) { 
    System.err.println("problem element " + line + ": " + problem); 
    } 
    } 
} 
public static String getDataFromElement(Element e) { 
    Node child = e.getFirstChild(); 
    if (child instanceof CharacterData) { 
    CharacterData cd = (CharacterData) child; 
    return cd.getData(); 
    } 
    else return ""; 
} 
} 
Dom Root element :nodes 
Create time: 12345 
problem element null: java.lang.NullPointerException 
Create time: 4567 
+0

Ajoutez juste un autre élément dans un élément de noeud il lève l'exception de pointeur NULL. – TechnocraT

+0

alors ne faites pas ça! : ^) –

+0

Hey ce n'est pas entre mes mains, je le reçois comme un modèle du serveur et mon programme doit l'analyser. – TechnocraT

1

Il arrive lorsqu'un -Element "node" n'a pas "CreateTime" -Element

+0

bien tous les éléments de noeud ont des éléments createTime en leur sein – TechnocraT

+0

+1 s'avère que vous aviez raison après tout! –

+0

Yup c'est parce qu'un autre élément de noeud est rencontré avant l'élément createTime dans le XML que nous descendons .. – TechnocraT