Pregunta

En mi entorno aquí uso Java para serializar el conjunto de resultados en XML.Sucede básicamente así:

//foreach column of each row
xmlHandler.startElement(uri, lname, "column", attributes);
String chars = rs.getString(i);
xmlHandler.characters(chars.toCharArray(), 0, chars.length());
xmlHandler.endElement(uri, lname, "column");

El XML se ve así en Firefox:

<row num="69004">
    <column num="1">10069</column>
    <column num="2">sd&#26;</column>
    <column num="3">FCVolume                      </column>
</row>

Pero cuando analizo el XML obtengo el a

org.xml.sax.SAXParseException:Referencia de personaje "&#26"Es un carácter XML inválido.

Mi pregunta ahora es:¿Qué caracteres tengo que reemplazar o cómo tengo que codificar mis caracteres para que sean XML válidos?

¿Fue útil?

Solución

Encontré una lista interesante en el Especificaciones XML:Según esa Lista, se desaconseja utilizar el carácter n.° 26 (hexadecimal: #x1A).

Los personajes definidos en los siguientes rangos también se desaniman.Son caracteres de control o personajes unicode permanentemente indefinidos

Ver el gamas completas.

Este código reemplaza todos los Xml Utf8 no válidos de una cadena:

public String stripNonValidXMLCharacters(String in) {
    StringBuffer out = new StringBuffer(); // Used to hold the output.
    char current; // Used to reference the current character.

    if (in == null || ("".equals(in))) return ""; // vacancy test.
    for (int i = 0; i < in.length(); i++) {
        current = in.charAt(i);
        if ((current == 0x9) ||
            (current == 0xA) ||
            (current == 0xD) ||
            ((current >= 0x20) && (current <= 0xD7FF)) ||
            ((current >= 0xE000) && (current <= 0xFFFD)) ||
            ((current >= 0x10000) && (current <= 0x10FFFF)))
            out.append(current);
    }
    return out.toString();
}    

está tomado de Caracteres XML no válidos:cuando UTF8 válido no significa XML válido

Pero con eso todavía tenía el problema de compatibilidad con UTF-8:

org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence

Despues de leer XML: devolver XML como UTF-8 desde un servlet Acabo de probar lo que sucede si configuro el tipo de contenido de esta manera:

response.setContentType("text/xml;charset=utf-8");

Y funcionó ....

Otros consejos

Extensible Markup Language (XML) 1.0 dice:

  

El carácter ampersand (& amp;) y el   el soporte del ángulo izquierdo (<) no debe aparecer   en su forma literal, excepto cuando   utilizado como delimitadores de marcado, o dentro de un   comentario, una instrucción de procesamiento, o   una sección de CDATA. Si son necesarios   en otro lugar, deben escapar usando   referencias numéricas de caracteres o   las cadenas " & amp; " y " < "   respectivamente. El ángulo recto   (>) puede representarse utilizando el   string " > " ;, y must, for   compatibilidad, se puede escapar utilizando   " > " o una referencia de personaje cuando   aparece en la cadena "]] > " en   contenido, cuando esa cadena no es   marcando el final de una sección CDATA.

Puede omitir la codificación si usa CDATA:

<column num="1"><![CDATA[10069]]></column>
<column num="2"><![CDATA[sd&]]></column>

¿Qué versión de JRE estás ejecutando? Sax Project dice:

  

J2SE 1.4 incluye una versión anterior de   SAX2. ¿Cómo hago que SAX2 r2 o posterior esté disponible?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top