Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > error al leer archivo xml

Hola comu, les tengo una consulta, necesito leer un archivo xml generado por otro programa. e visto muchas guias y tutoriales. pero no puedo ni abrir el archivo, ya probe con dom, sax y ahora estoy probando con JDom.
todos el mismo error:

[code]
com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: Byte no válido 1 de la secuencia UTF-8 de 1 bytes
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:687)
at com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:557)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1753)
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipChar(XMLEntityScanner.java:1426)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2754)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568)
at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:217)
at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:277)
at org.jdom2.input.sax.SAXBuilderEngine.build(SAXBuilderEngine.java:264)
at org.jdom2.input.SAXBuilder.build(SAXBuilder.java:1116)
at Vistas.Principal.archivosMouseClicked(Principal.java:258)
[/code]

mi codigo para abrir el archivo es este:

[code]
import java.io.File;
import java.io.IOException;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

SAXBuilder builder = new SAXBuilder();
File xmlFile = new File(RUTA COMPLETA DEL XML);
try{
Document document = (Document) builder.build( xmlFile );//ACA TIRA LA EXCEPCION
Element rootNode = document.getRootElement();
List list = rootNode.getChildren( "RaceResults" );

}catch ( IOException io ) {
io.printStackTrace();
}catch ( JDOMException jdomex ) {
jdomex.printStackTrace();
}
[/code]

mi archivo xml empieza asi:

[code]
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rF [
<!ENTITY rFEnt "rFactor Entity">
]>
<rFactorXML version="1.0">
<RaceResults>
<Setting>Multiplayer</Setting>
<ServerName>rFactor</ServerName>
<PlayerFile>player</PlayerFile>
<DateTime>1369875530</DateTime>
<TimeString>2013/05/29 21:58:50</TimeString>
.
.
.
.
.
[/code]

como ven en el xml, es generado por un juego, el rfactor, estoy haciendo un programa que me lea el Log, escrito en xml, y me muestre de manera mas amigable.

si alguien conoce algo sobre ese error, seria tan amable de darme una mano?

junio 6, 2013 | Registered Commentermauro10

¿Estás seguro de cuál es la codificación de ese archivo XML?
No me refiero a lo que dentro del archivo dice que es, sino a si realmente se ha generado con una codificación UTF-8
El error lo lanza con el primer byte de ese archivo, por lo que sospecho que su codificación real no es UTF-8

junio 6, 2013 | Registered Commenterchoces

como puedo averiguar eso? yo no soy el que creo ese xml.

junio 6, 2013 | Registered Commentermauro10

este es el xml completo
https://docs.google.com/file/d/0B6Qrf-i_gvhfVFRiZW5GZHpmdU0/edit?pli=1

junio 6, 2013 | Registered Commentermauro10

Cuando lo abro en NotePad++ http://notepad-plus-plus.org/
me dice que es ANSI as UTF8

junio 6, 2013 | Registered Commenterchoces

si, me di cuenta de eso tambien.
alguna solucion?

junio 6, 2013 | Registered Commentermauro10

Desde NotePad++ puedes cambiar la codificación del archivo.
Tal vez funcione.

junio 6, 2013 | Registered Commenterchoces

El problema es por que en el archivo vienen tildes

enero 2, 2014 | Unregistered Commenterpedro rodriguez

El asunto es que, al principio, no había nada. :) Es decir, sólo existía el ASCII de los caracteres 32-127. Luego se amplió con los PC para pasar usar los 8 bits de un byte, y comenzaron los problemas, porque todo el mundo quería meter "sus" caracteres, los que se usaban en su idioma. Seguro que a los más antiguos os suenan las codificaciones PC8 del PC, PC-850, Occidental, Windows 1252, ISO-8859-1, ISO-8859-15, etc.

En relación a un archivo cualquiera de texto, todas esas codificaciones no son más que convenciones sobre cómo interpretar/mostrar los bytes del archivo cuyo valor esté entre 128 y 255. En principio, no hay nada en el archivo que diga qué codificación usan. En los archivos SGML (HTML, XML, etc.) hay una directiva que permite indicar la codificación que debe usarse para interpretar esos caracteres, y los navegadores suelen respetarla, pero no todos los programas lo hacen igual.

Como 255 valores no servían para incluir todos los caracteres posibles, se buscó una solución general y apareció UTF y, en concreto, UTF-8. UTF-8 usa uno, dos o más bytes (creo que hasta cuatro, si recuerdo bien) para representar un carácter.

Como se intuyó que, por primera vez, se tenía LA solución universal al problema de las codificaciones, se pensó que sería buena idea marcar los archivos de una manera especial que permitiera, al abrirlos, identificar si se trataba de un archivo UTF-8 o no. Por ello, durante un tiempo, hubo una "convención oficiosa" consistente en insertar un par de bytes con un valor especial al principio que indicaba que el archivo es UTF-8 y, además, cómo ordenar los bytes que identifican un carácter extendido. A esos bytes iniciales se les llama Byte Order Mark, o BOM.

El problema es que UTF se extendió tan rápidamente que se pensó que no merecía la pena mantener esos dos bytes extras, que no son visualizables, y su uso no llegó a consolidarse tanto como para ser algo oficial. La última vez que investigué sobre el tema, leí que Java no tenía previsto proporcionar ninguna compatibilidad en el JDK con UTF-8 BOM.

Notepad++ tiene un modo hexadecimal con el que podrás comprobar si los dos primeros bytes son FEFF. Si es así, puedes descartarlos según lees el stream. Espero que te sirva.

enero 2, 2014 | Registered Commenterrickiees

Excelente explicación.

abril 17, 2015 | Unregistered Commentermatabares

Me pasaba lo mismo con un archivo. Se llamaba "plantilla.jrxml"

Lo arreglé abriendo el archivo con el bloc de notas. Le dí a guardar como, y le cambié la codificación que estaba en ANSI a UTF-8. Le cambié el nombre a "plantilla1.jrxml" y lo guardé. Luego eliminé el antiguo, "plantilla.jrxml" y le puse ese nombre al que había guardado con la codificación UTF-8.

noviembre 22, 2015 | Unregistered CommenterHuevitox7