2010-05-17 70 views
7

Java的XML解析器似乎認爲我的XML文檔沒有很好地在根元素之後形成。但我用幾種工具驗證了它們,但它們都不同意。這可能是我的代碼中的錯誤,而不是文檔本身。我非常感謝你們可以爲我提供的任何幫助。Java說XML文檔沒有很好形成

這裏是我的Java方法:

private void loadFromXMLFile(File f) throws ParserConfigurationException, IOException, SAXException { 
    File file = f; 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db; 
    Document doc = null; 
    db = dbf.newDocumentBuilder(); 
    doc = db.parse(file); 
    doc.getDocumentElement().normalize(); 
    String desc = ""; 
    String due = ""; 
    String comment = ""; 
    NodeList tasksList = doc.getElementsByTagName("task"); 
    for (int i = 0; i tasksList.getLength(); i++) { 
     NodeList attributes = tasksList.item(i).getChildNodes(); 
     for (int j = 0; i < attributes.getLength(); j++) { 
     Node attribute = attributes.item(i); 
     if (attribute.getNodeName() == "description") { 
      desc = attribute.getTextContent(); 
     } 
     if (attribute.getNodeName() == "due") { 
      due = attribute.getTextContent(); 
     } 
     if (attribute.getNodeName() == "comment") { 
      comment = attribute.getTextContent(); 
     } 
     tasks.add(new Task(desc, due, comment)); 
     } 
     desc = ""; 
     due = ""; 
     comment = ""; 
    } 
} 

以下是我試圖加載XML文件:

<?xml version="1.0"?> 
<tasklist> 
    <task> 
     <description>Task 1</description> 
     <due>Due date 1</due> 
     <comment>Comment 1</comment> 
     <completed>false</completed> 
    </task> 
    <task> 
     <description>Task 2</description> 
     <due>Due date 2</due> 
     <comment>Comment 2</comment> 
     <completed>false</completed> 
    </task> 
    <task> 
     <description>Task 3</description> 
     <due>Due date 3</due> 
     <comment>Comment 3</comment> 
     <completed>true</completed> 
    </task> 
</tasklist> 

,這裏是錯誤消息Java是扔我:

run: 
[Fatal Error] tasks.xml:28:3: The markup in the document following the root element must be well-formed. 
May 17, 2010 6:07:02 PM todolist.TodoListGUI <init> 
SEVERE: null 
org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed. 
     at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:239) 
     at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:283) 
     at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:208) 
     at todolist.TodoListGUI.loadFromXMLFile(TodoListGUI.java:199) 
     at todolist.TodoListGUI.<init>(TodoListGUI.java:42) 
     at todolist.Main.main(Main.java:25) 
BUILD SUCCESSFUL (total time: 19 seconds) 

作爲參考TodoListGUI.java:199是

doc = db.parse(file); 

如果背景是有幫助的人在這裏,我想編寫一個簡單的GUI應用程序來管理,可以讀取和寫入和定義任務XML文件的待辦事項列表。

+0

你可以發佈一個示例XML文檔嗎? – 2010-05-17 22:13:16

+0

您的XML標籤似乎已被吃掉 - 您可以編輯它們以使其可見嗎?你應該可以通過''<''得到'<'。 – psmears 2010-05-17 22:14:24

+0

@psmears:no,只需縮進4個空格或選擇代碼,然後按下編輯器工具欄中的「010101」按鈕或「Ctrl + K」鍵。 – BalusC 2010-05-18 00:18:57

回答

1

試着改變你的XML聲明:

<?xml version="1.0" encoding="UTF-8" ?> 
+1

ive修正了他的格式,現在它的確是 – 2010-05-17 22:15:36

+0

而我只是提出'編碼'的建議,因爲據我所知,你已經*已經有一個格式良好的XML文檔了......也許還有其他的事情正在進行在你的代碼中。 – EAMann 2010-05-17 22:23:52

+0

我沒有嘗試過。它仍然給我有或沒有編碼類型相同的錯誤。 – Pyroclastic 2010-05-17 22:29:53

4

我覺得有可能是錯誤的東西與實際文件。當我複製你的代碼,但使用XML作爲字符串輸入到它正常工作的解析器(固定幾個問題後 - attributes.item(i)attributes.item(j),你需要跳出循環時attribute == null的)。

在試圖重現你的錯誤,如果我再添<tasklist></tasklist>元素,我可以得到同樣的消息。這是因爲XML不再具有單個根元素(tasklist)。這是你看到的問題嗎? tasks.xml中的XML是否具有單個根元素?

0

對於它的價值,Scala REPL成功解析了您的標記。

scala> val tree = <tasklist> 
| <task> 
| <description>Task 1</description> 
| <due>Due date 1</due> 
| <comment>Comment 1</comment> 
| <completed>false</completed> 
| </task> 
| <task> 
| <description>Task 2</description> 
| <due>Due date 2</due> 
| <comment>Comment 2</comment> 
| <completed>false</completed> 
| </task> 
| <task> 
| <description>Task 3</description> 
| <due>Due date 3</due> 
| <comment>Comment 3</comment> 
| <completed>true</completed> 
| </task> 
| </tasklist> 
tree: scala.xml.Elem = 
<tasklist> 
<task> 
<description>Task 1</description> 
<due>Due date 1</due> 
<comment>Comment 1</comment> 
<completed>false</completed> 
</task> 
<task> 
<description>Task 2</description> 
<due>Due date 2</due> 
<comment>Comment 2</comment> 
<completed>false</completed> 
</task> 
<task> 
<description>Task 3</description> 
<due>Due date 3</due> 
<comment>Comment 3</comment> 
<completed>true</completed> 
</task> 
</tasklist> 
12

org.xml.sax.SAXParseException:根元素下面的文檔中的標記必須被良好地形成。

此特定異常表示XML文檔中存在多個根元素。換句話說,<tasklist>不是唯一的根元素。以您的XML文檔爲例,請考慮沒有<tasklist>元素和三個<task>元素的根。這會導致這種異常。

由於您發佈的XML文件看起來很好,所以問題在於別的地方。它看起來不是解析你期望它解析的XML文件。爲了快速調試,添加以下到你的方法頂部:

System.out.println(f.getAbsolutePath()); 

定位在磁盤文件系統中的文件,並驗證它。

+0

+1這正是我的問題。謝謝! – Ben 2012-03-25 07:42:23

0

另一個值得注意的是,這裏是我將xml保存到一個名爲test.xml的文件中,然後運行到xmllint

[[email protected]] [~] 
xmllint test.xml 
<?xml version="1.0"?> 
<tasklist> 
    <task> 
     <description>Task 1</description> 
     <due>Due date 1</due> 
     <comment>Comment 1</comment> 
     <completed>false</completed> 
    </task> 
    <task> 
     <description>Task 2</description> 
     <due>Due date 2</due> 
     <comment>Comment 2</comment> 
     <completed>false</completed> 
    </task> 
    <task> 
     <description>Task 3</description> 
     <due>Due date 3</due> 
     <comment>Comment 3</comment> 
     <completed>true</completed> 
    </task> 
</tasklist> 

似乎很好。最有可能的是你有一些你在實際文件中看不到的流浪角色。嘗試在編輯器中查看實際文件,該編輯器將顯示不可打印的字符,如其他人所建議的,如果這不是英語UTF-8計算機,則可能有一些Unicode字符無法看到解析器。那或者你沒有加載你認爲你是的文件。在進入解析器之前,逐步調試並查看文件的實際內容。

0

您確定這是該文件中的所有內容嗎?錯誤是抱怨在當前根後有更多標記。所以在</tasklist>之後肯定還有別的東西。

有時,此錯誤可能是由不可打印的字符引起的。如果您沒有看到任何內容,請對該文件執行hexdump。

相關問題