Java 说 XML 文档格式不正确
Posted
技术标签:
【中文标题】Java 说 XML 文档格式不正确【英文标题】:Java saying XML Document Not Well Formed 【发布时间】:2011-02-20 15:32:22 【问题描述】: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 文件。
【问题讨论】:
你能发布一个示例 XML 文档吗? 您的 XML 标签似乎已被吃掉 - 您可以编辑以使其可见吗?您应该能够使用“&lt;
”获得<
。
@psmears:不,只需缩进 4 个空格或选择代码,然后按编辑器工具栏中的010101
按钮或Ctrl+K
键。
你确定输入是你所期望的吗?
【参考方案1】:
org.xml.sax.SAXParseException:文档中根元素之后的标记必须格式正确。
这一特殊异常表明 XML 文档中有多个根元素。换句话说,<tasklist>
不是唯一的根元素。以您的 XML 文档为例,请考虑一个没有 <tasklist>
元素且根中有三个 <task>
元素的文档。这会导致这种异常。
由于您发布的 XML 文件看起来不错,问题出在其他地方。看起来它没有解析您期望它正在解析的 XML 文件。为了快速调试,请将以下内容添加到您的方法顶部:
System.out.println(f.getAbsolutePath());
在磁盘文件系统中找到文件并验证。
【讨论】:
【参考方案2】:我认为实际文件可能有问题。当我复制您的代码但使用 XML 作为解析器的字符串输入时,它可以正常工作(在解决了几个问题之后 - attributes.item(i)
应该是 attributes.item(j)
并且您需要在 attribute == null
时跳出循环)。
在尝试重现您的错误时,如果我添加另一个 <tasklist></tasklist>
元素,我会收到相同的消息。这是因为 XML 不再具有单个根元素(任务列表)。这是你看到的问题吗? tasks.xml
中的 XML 是否只有一个根元素?
【讨论】:
【参考方案3】:尝试将您的 XML 声明更改为:
<?xml version="1.0" encoding="UTF-8" ?>
【讨论】:
我只提出encoding
的建议是因为,据我所知和测试,您已经拥有一个格式良好的 XML 文档......也许有什么其他在你的代码中。
我尝试这样做一无所获。无论有没有编码类型,它仍然给我同样的错误。【参考方案4】:
不管怎样,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>
【讨论】:
【参考方案5】:另一个值得一提的是,当我将您的 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 字符。那或者您没有加载您认为的文件。单步调试,在文件输入解析器之前查看文件的实际内容。
【讨论】:
【参考方案6】:您确定这是该文件中的所有内容吗?该错误抱怨在当前根之后有更多标记。所以</tasklist>
后面肯定还有别的东西。
有时,此错误可能是由不可打印的字符引起的。如果您没有看到任何内容,请对文件执行 hexdump。
【讨论】:
以上是关于Java 说 XML 文档格式不正确的主要内容,如果未能解决你的问题,请参考以下文章
验证 xml 时出现“根元素之前的文档中的标记必须格式正确”错误