2010-05-17 34 views
7

El analizador XML de Java parece estar pensando que mi documento XML no está bien formado siguiendo el elemento raíz. Pero lo he validado con varias herramientas y todos están en desacuerdo. Probablemente sea un error en mi código en lugar de en el documento en sí. Realmente agradecería cualquier ayuda que pudieran ofrecerme.Java diciendo que el documento XML no está bien formado

Aquí es mi método 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 = ""; 
    } 
} 

El siguiente es el archivo XML que estoy tratando de carga:

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

Y aquí está el mensaje de error de Java está lanzando para mí:

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) 

Para TodoListGUI.java:199 referencia es

doc = db.parse(file); 

Si el contexto es útil para cualquier persona aquí, estoy tratando de escribir una aplicación GUI simple para administrar una lista de tareas pendientes que puede leer y escribir en y desde archivos XML que definen las tareas.

+0

¿Puedes publicar un documento XML de muestra? –

+0

Sus etiquetas XML parecen haberse comido. ¿Podría editarlas para que sean visibles? Debería poder obtener un '<' con '' < ''. – psmears

+0

@psmears: no, simplemente sangría con 4 espacios o seleccione el código y luego presione el botón '010101' en la barra de herramientas del editor o la tecla' Ctrl + K'. – BalusC

Respuesta

1

trate de cambiar su declaración XML a:

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

he reparado su formateo, ahora lo hace –

+0

Y solo hago la sugerencia de 'codificación' porque, por lo que puedo decir y probar, * ya * tiene un documento XML bien formado ... tal vez esté sucediendo algo más en tu código – EAMann

+0

No tengo nada por intentar eso. Todavía me está dando el mismo error con o sin el tipo de codificación. – Pyroclastic

4

Creo que puede haber algo mal con el archivo real. Cuando copio tu código pero uso el XML como una entrada de cadena para el analizador, funciona bien (después de solucionar un par de problemas - attributes.item(i) debe ser attributes.item(j) y necesitas salir del lazo cuando attribute == null).

Al tratar de reproducir su error, puedo obtener el mismo mensaje si agrego otro elemento <tasklist></tasklist>. Esto se debe a que el XML ya no tiene un único elemento raíz (lista de tareas). ¿Es este el problema que estás viendo? ¿El XML en tasks.xml tiene un único elemento raíz?

0

Por lo que vale, el Scala REPL analizó con éxito su marcado.

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: El marcado del documento que sigue al elemento raíz debe estar bien formado.

Esta excepción particular indica que hay más de un elemento raíz en el documento XML. En otras palabras, el <tasklist> no es el único elemento raíz. Para tomar su documento XML como ejemplo, piense en uno sin el elemento <tasklist> y con tres elementos <task> en la raíz. Esto causaría este tipo de excepción.

Dado que el archivo XML que ha publicado se ve bien, el problema está en otra parte. Parece que no está analizando el archivo XML que espera que esté analizando. Para una depuración rápida, agregue lo siguiente a la parte superior de su método:

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

Ubique el archivo en el sistema de archivos del disco y verifíquelo.

+0

+1 Este fue exactamente mi problema. ¡Gracias! – Ben

0

Otro por lo que vale, aquí es lo que obtengo cuando guardé su xml en un archivo llamado test.xml y lo ejecuté por 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> 

parece estar bien. lo más probable es que tenga algunos personajes extraviados que no puede ver allí en algún lugar de su archivo real. Intente ver el archivo real en un editor que mostrará caracteres no imprimibles, como alguien más sugirió que si no se trata de una máquina UTF-8 en inglés, es posible que tenga algunos caracteres Unicode que no puede ver que el analizador hace. Eso o no estás cargando el archivo que crees que eres. Depure la depuración y vea cuál es el contenido real del archivo antes de alimentarlo en el analizador.

0

¿Seguro que ese es el contenido de ese archivo? El error es quejarse de que hay más marcado después de la raíz actual. Entonces debe haber algo más después de </tasklist>.

A veces, este error puede deberse a caracteres no imprimibles. Si no ve nada, haga un hexdump del archivo.

Cuestiones relacionadas