Java говорит, что XML-документ плохо сформирован
Похоже, что синтаксический анализатор Java в 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);
Если контекст кому-то здесь полезен, я пытаюсь написать простое приложение с графическим интерфейсом для управления списком задач, которые могут считывать и записывать файлы XML и из них, определяя задачи.
6 ответов
org.xml.sax.SAXParseException: разметка в документе после корневого элемента должна быть правильно сформирована.
Это конкретное исключение указывает на то, что в документе XML имеется более одного корневого элемента. Другими словами, <tasklist>
не единственный корневой элемент. Чтобы взять ваш XML-документ в качестве примера, подумайте об одном без <tasklist>
элемент и с тремя <task>
элементы в корне. Это приведет к такого рода исключениям.
Поскольку размещенный вами файл XML выглядит нормально, проблема кроется в другом. Похоже, что он не анализирует XML-файл, который вы ожидаете, что он анализирует. Для быстрой отладки добавьте следующее в начало вашего метода:
System.out.println(f.getAbsolutePath());
Найдите файл в файловой системе диска и проверьте его.
Я думаю, что может быть что-то не так с самим файлом. Когда я копирую ваш код, но использую XML в качестве входных данных для парсера, он работает нормально (после устранения нескольких проблем - attributes.item(i)
должно быть attributes.item(j)
и вам нужно вырваться из цикла, когда attribute == null
).
Пытаясь воспроизвести вашу ошибку, я могу получить то же сообщение, если добавлю еще <tasklist></tasklist>
элемент. Это связано с тем, что в XML больше нет единого корневого элемента (списка задач). Это проблема, которую вы видите? Есть ли в XML tasks.xml
есть один корневой элемент?
Попробуйте изменить объявление XML на:
<?xml version="1.0" encoding="UTF-8" ?>
Вы уверены, что это все в этом файле? Ошибка жалуется, что есть больше разметки после текущего корня. Так что должно быть что-то еще после </tasklist>
,
Иногда эта ошибка может быть вызвана непечатными символами. Если вы ничего не видите, сделайте hexdump файла.
Для чего это стоит, 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>
Еще один, что стоит, вот то, что я получаю, когда я сохранил ваш 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, которые вы не можете видеть, как это делает парсер. Это или вы не загружаете файл, который вы считаете. Шаг отладки и посмотрите, что на самом деле содержится в файле, прежде чем он будет передан в анализатор.