2013-04-13 67 views
0

這裏是我的xml文件:Java的DOM解析器錯誤

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE Server SYSTEM "Server.dtd"> 
<Server> 
    <MaximumUserNumber>2</MaximumUserNumber> 
    <ServerPortNumber>1234</ServerPortNumber> 
    <MessagesQueueSize>5</MessagesQueueSize> 
</Server> 

這裏是我的Server.dtd:

<?xml version="1.0" encoding="UTF-8"?> 
<!ELEMENT Server 
     (MaximumUserNumber, 
      ServerPortNumber, 
      MessagesQueueSize)> 
<!ELEMENT MaximumUserNumber (#PCDATA)> 
<!ELEMENT ServerPortNumber (#PCDATA)> 
<!ELEMENT MessagesQueueSize (#PCDATA)> 

這裏是我的代碼,這給了我一個NullPointerException:

public Server() { 
     try { 

      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
      dbf.setValidating(true); 
      Document document = dbf.newDocumentBuilder().parse("config.xml"); 
      document.normalizeDocument(); 
      NodeList nl = document.getElementsByTagName("MaximumUserNumber"); 
      nl.item(0); // this line causes exception 

      } 
} 

我做錯了什麼?謝謝!

+0

我用Java 6試過了你的代碼,它沒有任何異常。你使用哪個Java版本?你應該重新檢查你的代碼實際處理的'config.xml'是否真的是預期的版本。你確定,你的文檔是否符合你認爲的DTD版本?無論如何,你應該在調用'nl.item(0)'之前檢查'NodeList'的長度。很明顯,在你的情況下,長度是0.如果你只用這些代碼片段創建一個獨立的測試項目,你仍然得到長度爲0? – vanje

回答

1

你的代碼看起來不錯。

它甚至不會在jdk-7上拋出任何異常。也許,你沒有包括那些代碼。

你只是沒有做到一個步驟中尋找元素的值:

NodeList nodeList = document.getElementsByTagName("MaximumUserNumber"); 
    Node foundNode = nodeList.item(0); 
    Node textNode = foundNode.getChildNodes().item(0); 
    String value = textNode.getNodeValue(); 
    System.out.println(value); 

輸出

2 

說明

document.getElementsByTagName("MaximumUserNumber")回報的NodeList。它有一個找到的節點。即使只包含文本的每個元素節點(類型== ELEMENT_NODE)都有孩子。在這種情況下,唯一的孩子是TEXT_NODE類型的節點:Node textNode = foundNode.getChildNodes().item(0);。從這種類型的節點中,您可以獲得它的價值。

有一種更快的方式來從純文本元素的文本值:

NodeList nodeList = document.getElementsByTagName("MaximumUserNumber"); 
    Node foundNode = nodeList.item(0); 
    String value = foundNode.getTextContent(); 
    System.out.println(value); 

這裏,.getTextContent()返回此節點及其後代的文本內容。

這兩種情況都不是很安全(沒有空檢查和節點類型檢查),但是如果與模式一起使用可能被認爲是這樣。