Java的XML解析器似乎认为我的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应用程序来管理todo列表,该列表可以读取和写入定义任务的XML文件。
答案 0 :(得分:12)
org.xml.sax.SAXParseException:根元素后面的文档中的标记必须格式正确。
此特殊异常表示XML文档中有多个根元素。换句话说,<tasklist>
不是唯一的根元素。以XML文档为例,考虑一个没有<tasklist>
元素且根目录中有三个<task>
元素的元素。这会导致这种异常。
由于您发布的XML文件看起来很好,问题出在其他地方。看起来它没有解析你期望解析的XML文件。要进行快速调试,请将以下内容添加到方法的顶部:
System.out.println(f.getAbsolutePath());
在磁盘文件系统中找到该文件并进行验证。
答案 1 :(得分:4)
我认为实际文件可能有问题。当我复制你的代码但是使用XML作为解析器的字符串输入时,它工作正常(在解决了几个问题之后 - attributes.item(i)
应该是attributes.item(j)
并且你需要在attribute == null
时摆脱循环{1}})。
在尝试重现您的错误时,如果我添加另一个<tasklist></tasklist>
元素,我可以收到相同的消息。这是因为XML不再具有单个根元素(tasklist)。这是你看到的问题吗? tasks.xml
中的XML是否只有一个根元素?
答案 2 :(得分:1)
尝试将XML声明更改为:
<?xml version="1.0" encoding="UTF-8" ?>
答案 3 :(得分: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>
答案 4 :(得分:0)
另一个值得一提的是,这是我将xml保存到名为test.xml
的文件并通过xmllint运行时获得的结果。
[jhr@Macintosh] [~]
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字符。那或你没有加载你认为你的文件。步骤调试,看看文件的实际内容在被送入解析器之前是什么。
答案 5 :(得分:0)
您确定该文件中的所有内容吗?错误是抱怨当前root之后有更多标记。因此</tasklist>
之后必须有其他内容。
有时,此错误可能是由不可打印的字符引起的。如果您没有看到任何内容,请执行文件的hexdump。