Analizando InputStream desde URL con parámetros

Estoy tratando de analizar la siguiente URL: http://kavim-t.co.il/include/getXMLStations.asp?parent=55_%20_2

Código:

//using jdom SAX parser
SAXBuilder builder = new SAXBuilder();
URL url = new URL("http://kavim-t.co.il/include/getXMLStations.asp?parent=55_%20_2");
InputStream in = getInputStrem(url);
Document document = builder.build(in); ...

getInputStream ():

public static InputStream getInputStrem(URL url) {
    InputStream in = null;
    try {
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.connect();
        in = con.getInputStream();

    } catch (IOException e) {
        e.printStackTrace();
    }
    return in;
}

Excepción "Error en la línea 3: en la línea 3, columna 29: mal formado (token no válido)"

se obtiene al intentar ejecutar la siguiente línea:

Document document = builder.build(in)  

Creo que el problema está en la función getInputStream (),

porque si reemplazo Url por uno más simple (sin parámetros y estructura clásica), está funcionando bien.

Respuesta 1

Probablemente sea un problema de codificación de caracteres. El error que está recibiendo probablemente se deba a que InputStream se está interpretando en un conjunto de caracteres diferente a los datos reales.

Las URL tienen una secuencia de entrada, pero también un conjunto de caracteres. Estás ignorando ese juego de caracteres cuando suministras la secuencia a JDOM.

Lo primero que debe intentar es eliminar todo su código getInputStream. JDOM tiene un método SAXBuilder.build (URL) directo, y ese método tendrá en cuenta tanto la secuencia como el conjunto de caracteres ...

Su código completo podría simplificarse de esa manera. De hecho, si le da a JDOM un argumento estricto, lo interpreta como una URL (SystemID), por lo que su código podría ser tan simple como:

SAXBuilder builder = new SAXBuilder();
Document document = builder.build("http://kavim-t.co.il/include/getXMLStations.asp?parent=55_%20_2");

EDITAR: ---

Bueno, ejecuté 'mi' versión del código en mi entorno, y (usando Xerces como analizador) obtuve más detalles sobre el problema ...:

Caused by: org.apache.xerces.impl.io.MalformedByteSequenceException: Invalid byte 2 of 3-byte UTF-8 sequence.
    at org.apache.xerces.impl.io.UTF8Reader.invalidByte(Unknown Source)
    at org.apache.xerces.impl.io.UTF8Reader.read(Unknown Source)
    at org.apache.xerces.impl.XMLEntityScanner.load(Unknown Source)
    at org.apache.xerces.impl.XMLEntityScanner.scanContent(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanContent(Unknown Source)
    ... 11 more

Entonces, parece que sus datos de entrada no están codificados correctamente ...

EDITAR DE NUEVO:

Aquí está la salida de xmllint en el documento de entrada. xmllint es un programa unix disponible en la mayoría de las distribuciones de Linux. Proporciona una buena forma "objetiva" de validar su XML.

david.xml:3: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0xEE 0xF1 0xE5 0xF3
<option value="22958">22958: îñåó øéãéðâ</option><option value="22920">22920: ãé
                             ^

Realmente, tienes un documento XML roto. Sin embargo, si insiste , puede agregar un controlador de errores al SAXBuilder de JDOM que ignora el error. Consulte la documentación de JDOM aquí: http://www.jdom.org/docs/apidocs/org/jdom2/input/SAXBuilder.html#setErrorHandler%28org.xml.sax.ErrorHandler%29 donde puede agregar un ErrorHandler que ignora el problema. (anule el método de error y regrese en lugar de lanzar la excepción) ... entonces el problema no se informará y el analizador 'continuará', pero le faltarán datos en los resultados analizados ...

Respuesta: 2

Tuve el mismo problema al leer un archivo, lo resolví con esto:

File file = new File("/somewhere/somefile.xml"); 
FileInputStream stream = new FileInputStream(file), "UTF-8");
Reader reader = new BufferedReader(new InputStreamReader(stream));

SAXBuilder builder = new SAXBuilder();           
Document doc = builder.build(reader);

En su caso, probablemente obtendría la secuencia de URL como:

InputStream stream = new URL("http://www.somewhere.com/somefile.xml").openStream();
Reader reader = new BufferedReader(new InputStreamReader(stream));

SAXBuilder builder = new SAXBuilder();           
Document doc = builder.build(reader);

Como último recurso (ya que la codificación no se puede aplicar en Url :: openStream ()), guardaría los datos localmente y luego los abriría con una secuencia de archivos como en mi primer ejemplo.

Respuesta: 3

Estoy escribiendo una aplicación de Android que se comunicará con la PC. Intenté crear 2 paquetes en un solo proyecto de eclipse, pero esto no parece funcionar. Cuando trato de depurar la aplicación Java para PC, ...

Algunos lenguajes de programación tienen la característica de agregar "Categorías" a las clases (por ejemplo, Objective-C), esto significa, agregar nuevas funcionalidades a una clase sin subclases. Realmente lo encuentro útil ...

Estoy buscando crear una aplicación web móvil simple, y estoy considerando una buena biblioteca jsf (caras de servidor Java) para este propósito. ¿Qué bibliotecas JSF me recomiendan? Estoy buscando algo que (a) ...

Estoy tratando de cargar un archivo con el Cliente HTTP de Apache y MultipartRequests, pero me da un error, aquí está mi código: PostMethod filePost = new PostMethod ("http: // host / some_path"); Parte [] partes = {...