2011-07-22 167 views
0

我在Java中使用DOM解析XML文档。数据是这样的:Java DOM - 空指针异常

<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> 

这是我使用的解析我的代码的相关部分:

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); 
} 

而且我getDataFromElement方法是

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

我问题在于,它在打印第一个createTime的值后给出null pointer exception

getDataFromElement()方法

任何人都可以帮我诊断这个问题吗?

+0

FYI IAM使用javax.xml.parsers中...和org.w3c.dom ....类。 – TechnocraT

+2

如果你再次尊重人们的时间,你会给我们一个SSCCE,而不必解释这一点。 –

+1

哪一行完全抛出这个异常? – alexblum

回答

0

使用try/catch来消除不必要的节点:

[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

只需在节点元素中添加另一个元素就会引发空指针异常。 – TechnocraT

+0

所以不要那样做! :^) –

+0

嘿那不在我手中,我收到它作为服务器的模板,我的程序必须解析它。 – TechnocraT

1

它发生时,任何 “节点” - 元素没有 “createTime” - 元素

+0

以及所有节点元素中都有createTime元素 – TechnocraT

+0

+1证明您毕竟是正确的! –

+0

是因为在XML中的createTime元素之前遇到另一个节点元素,因为我们往下走。 – TechnocraT