2010-05-17 4 views
7

Javas XML-Parser scheint zu denken, dass mein XML-Dokument nach dem Wurzelelement nicht gut gebildet ist. Aber ich habe es mit mehreren Tools validiert und sie sind alle anderer Meinung. Es ist wahrscheinlich ein Fehler in meinem Code und nicht im Dokument selbst. Ich würde wirklich jede Hilfe schätzen, die Sie mir anbieten könnten.Java-Sprichwort XML-Dokument nicht gut gebildet

Hier ist meine Java-Methode:

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 = ""; 
    } 
} 

Das Folgende ist die XML-Datei, die ich zu Last bin versucht:

<?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> 

Und hier wird die Fehlermeldung Java ist für mich zu werfen:

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) 

Als Referenz TodoListGUI.java:199 ist

Wenn Kontext hier für jemanden hilfreich ist, versuche ich eine einfache GUI-Anwendung zu schreiben, um eine Todo-Liste zu verwalten, die XML-Dateien lesen und schreiben kann, die die Aufgaben definieren.

+0

können Sie ein XML-Beispieldokument posten? –

+0

Ihre XML-Tags scheinen gefressen worden zu sein - könnten Sie sie bearbeiten, um sie sichtbar zu machen? Sie sollten in der Lage sein, ein '<' mit ''<'' zu bekommen. – psmears

+0

@psmears: Nein, nur mit 4 Leerzeichen einrücken oder Code auswählen und dann '010101' in der Editor-Symbolleiste oder die' Strg + K'-Taste drücken. – BalusC

Antwort

1

Versuchen Sie, Ihre XML-Deklaration zu ändern zu:

<?xml version="1.0" encoding="UTF-8" ?> 
+1

ive hat seine Formatierung korrigiert, jetzt tut es –

+0

Und ich mache nur den 'encoding'-Vorschlag, weil, soweit ich es sagen und testen kann, * du * bereits * ein wohlgeformtes XML-Dokument hast ... vielleicht ist da noch etwas los in deinem Code. – EAMann

+0

Ich habe nichts davon, das zu versuchen. Es gibt mir immer noch den gleichen Fehler mit oder ohne den Kodierungstyp. – Pyroclastic

4

ich denke, es ist etwas falsch mit der eigentlichen Datei sein kann. Wenn ich Ihren Code kopiere, aber den XML-Code als String-Eingabe für den Parser verwende, funktioniert er einwandfrei (nach Behebung einiger Probleme - attributes.item(i) sollte attributes.item(j) sein und Sie müssen aus der Schleife ausbrechen, wenn attribute == null).

Beim Versuch, Ihren Fehler zu reproduzieren, kann ich die gleiche Nachricht erhalten, wenn ich ein weiteres <tasklist></tasklist> Element hinzufüge. Dies liegt daran, dass das XML nicht mehr ein einzelnes Wurzelelement (Tasklist) hat. Ist das das Problem, das Sie sehen? Hat das XML in tasks.xml ein einzelnes Wurzelelement?

0

Für was es wert ist, die Scala REPL erfolgreich analysiert Ihr Markup.

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> 
12

org.xml.sax.SAXParseException: Das Markup in dem Dokument nach dem Stammelement müssen gut ausgebildet.

Diese spezielle Ausnahme gibt an, dass im XML-Dokument mehr als ein Stammelement vorhanden ist. Mit anderen Worten, das <tasklist> ist nicht das einzige Wurzelelement. Um Ihr XML-Dokument als Beispiel zu nehmen, denken Sie an eines ohne das <tasklist> Element und mit drei <task> Elementen im Stammverzeichnis. Dies würde diese Art von Ausnahme verursachen.

Da die von Ihnen gepostete XML-Datei gut aussieht, liegt das Problem woanders. Es sieht so aus, als würde es die XML-Datei, die Sie analysieren, nicht parsen. Fügen Sie für das schnelle Debuggen dem Anfang Ihrer Methode folgend hinzu:

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

Suchen Sie die Datei in dem Disketten-Dateisystem und überprüfen Sie es.

+0

+1 Das war genau mein Problem. Vielen Dank! – Ben

0

Eine andere für was es wert ist, hier ist, was ich bekomme, wenn ich Ihre XML in eine Datei namens test.xml gespeichert und lief es durch xmllint.

[[email protected]] [~] 
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> 

scheint in Ordnung zu sein. Höchstwahrscheinlich haben Sie einige verirrte Zeichen, die Sie irgendwo in Ihrer tatsächlichen Datei nicht sehen können. Versuchen Sie, die tatsächliche Datei in einem Editor anzuzeigen, der nicht druckbare Zeichen anzeigt, wie es jemand anderes vorgeschlagen hat. Wenn dies kein englischer UTF-8-Computer ist, könnten Sie einige Unicode-Zeichen haben, die der Parser nicht sehen kann. Das oder Sie laden nicht die Datei, von der Sie denken, dass Sie sie sind. Schritt Debuggen und sehen, was der eigentliche Inhalt der Datei ist, bevor es in den Parser eingespeist wird.

0

Sind Sie sicher, dass das alles in dieser Datei ist? Der Fehler beschwert sich, dass nach dem aktuellen Root mehr Markup vorhanden ist. Also muss es noch etwas anderes geben nach </tasklist>.

Dieser Fehler kann manchmal durch nicht druckbare Zeichen verursacht werden. Wenn Sie nichts sehen, machen Sie einen Hexdump der Datei.

Verwandte Themen