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, которые вы не можете видеть, как это делает парсер. Это или вы не загружаете файл, который вы считаете. Шаг отладки и посмотрите, что на самом деле содержится в файле, прежде чем он будет передан в анализатор.

Другие вопросы по тегам