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