7

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);

コンテキストが誰かの役に立つなら、タスクを定義する XML ファイルを読み書きできる todo リストを管理する単純な GUI アプリケーションを作成しようとしています。

4

6 に答える 6

12

org.xml.sax.SAXParseException: ルート要素に続くドキュメント内のマークアップは整形式でなければなりません。

この特定の例外は、XML ドキュメントに複数のルート要素があることを示しています。つまり、<tasklist>ルート要素は だけではありません。XML 文書を例にとると、要素がなく、ルート<tasklist>に 3 つの要素があるものを考えてみてください。<task>これにより、この種の例外が発生します。

あなたが投稿した XML ファイルは問題ないように見えるので、問題は別の場所にあります。解析していると予想される XML ファイルを解析していないようです。すばやくデバッグするには、メソッドの先頭に次を追加します。

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

ディスク ファイル システムでファイルを見つけて確認します。

于 2010-05-18T00:29:05.490 に答える
4

実際のファイルに問題がある可能性があると思います。コードをコピーしても、パーサーへの文字列入力として XML を使用すると、正常に動作します (いくつかの問題を修正した後、ループから抜け出す必要attributes.item(i)があります)。attributes.item(j)attribute == null

エラーを再現しようとすると、別の<tasklist></tasklist>要素を追加すると同じメッセージが表示されます。これは、XML のルート要素 (タスクリスト) が 1 つではなくなったためです。これはあなたが見ている問題ですか?の XML にtasks.xmlは単一のルート要素がありますか?

于 2010-05-17T23:43:42.960 に答える
1

XML 宣言を次のように変更してみてください。

<?xml version="1.0" encoding="UTF-8" ?>
于 2010-05-17T22:14:24.683 に答える
0

もう 1 つの価値があるのは、xml をxmllinttest.xmlという名前のファイルに保存し、それを実行したときに得られるものです。

[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 文字が含まれている可能性があることを他の誰かが示唆しています。それか、あなたが思っているファイルをロードしていません。デバッグをステップ実行し、パーサーにフィードされる前に、ファイルの実際の内容を確認します。

于 2010-05-18T00:29:40.543 に答える
0

それだけの価値はありますが、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>
于 2010-05-18T00:03:53.757 に答える
0

それがそのファイルのすべてだと確信していますか?エラーは、現在のルートの後にさらにマークアップがあることを訴えています。したがって、 の後に何か他のものがあるに違いありません</tasklist>

このエラーは、印刷できない文字が原因である場合があります。何も表示されない場合は、ファイルの 16 進ダンプを実行します。

于 2010-05-18T01:03:05.880 に答える