Java говоря XML-документ, Не Хорошо Сформированный

Синтаксический анализатор 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-файлов, определяющих задачи.

7
задан Ripon Al Wasim 1 March 2013 в 08:45
поделиться

6 ответов

org.xml.sax.SAXParseException: разметка в документе, следующем за корневым элементом, должна быть правильно сформированной.

Это конкретное исключение указывает на то, что в XML-документе имеется более одного корневого элемента. Другими словами, не единственный корневой элемент. Чтобы взять ваш XML-документ в качестве примера, представьте себе документ без элемента и с тремя элементами в корне. Это вызовет исключение такого рода.

Поскольку опубликованный вами XML-файл выглядит нормально, проблема в другом. Похоже, что это не синтаксический анализ XML-файла, который, как вы ожидаете, анализирует. Для быстрой отладки добавьте в начало метода следующее:

System.out.println(f.getAbsolutePath());

Найдите файл в файловой системе диска и проверьте его.

12
ответ дан 6 December 2019 в 11:46
поделиться

Еще одно, чего оно стоит, вот что я получаю, когда сохраняю ваш 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, которые вы не видите, что делает синтаксический анализатор. Это или вы не загружаете файл, который, по вашему мнению, вы загружаете. Пошаговая отладка и посмотрите, каково фактическое содержимое файла, прежде чем он будет загружен в синтаксический анализатор.

0
ответ дан 6 December 2019 в 11:46
поделиться

Вы уверены, что это все, что есть в этом файле? Ошибка заключается в том, что после текущего корня есть больше разметки. Значит, после должно быть что-то еще.

Иногда эта ошибка может быть вызвана непечатаемыми символами. Если вы ничего не видите, сделайте шестнадцатеричный дамп файла.

0
ответ дан 6 December 2019 в 11:46
поделиться

Как бы то ни было, 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>
0
ответ дан 6 December 2019 в 11:46
поделиться

Я думаю, что с самим файлом что-то не так. Когда я копирую ваш код, но использую XML в качестве входной строки для синтаксического анализатора, он работает нормально (после исправления пары проблем - attributes.item (i) должен быть attributes.item (j)) и вам нужно выйти из цикла, когда attribute == null ).

При попытке воспроизвести вашу ошибку я могу получить то же сообщение, если добавлю еще один элемент . Это связано с тем, что в XML больше нет единого корневого элемента (списка задач). Это проблема, которую вы видите? Имеет ли XML в tasks.xml единственный корневой элемент?

4
ответ дан 6 December 2019 в 11:46
поделиться

Попробуйте изменить объявление XML на:

<?xml version="1.0" encoding="UTF-8" ?>
1
ответ дан 6 December 2019 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: