Pergunta

No meu ambiente aqui eu usar Java para serializar o conjunto de resultados para XML. Isso acontece basicamente assim:

//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");

Os olhares XML como este no Firefox:

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

Mas quando eu analisar o XML recebo a um

org.xml.sax.SAXParseException: referência de caracteres " & # 26 " é um caracteres XML inválido.

A minha pergunta agora é: qual o charactes eu tenho que substituir ou como é que eu tenho para codificar meus personagens, que eles serão XML válido

Foi útil?

Solução

Eu encontrei uma lista interessante no Xml Spec : De acordo com essa lista seu desencorajados de usar o caractere # 26 (Hex: # X1A ).

Os caracteres definidos no gamas seguintes também são desencorajados. Eles são ou caracteres de controle ou permanentemente indefinido Unicode caracteres

Veja as gamas completas .

Este código substitui todos os não-válido XML Utf8 de uma string:

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();
}    

sua tirada caracteres inválidos XML: quando UTF8 válida não significa XML válido

Mas com o que eu tinha a questão compatility ainda UTF-8:

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

Depois de ler XML - XML ??retornar como UTF-8 a partir de um servlet Eu apenas tentei o que acontece se eu definir o tipo de conteúdo como este:

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

E funcionou ....

Outras dicas

Extensible Markup Language (XML) 1.0 diz:

O caractere e comercial (&) eo sinal de menor (<) não deve aparecer em sua forma literal, exceto quando usado como delimitadores de marcação, ou dentro de um comentar, uma instrução de processamento, ou uma seção CDATA. Se eles são necessários em outros lugares, eles devem ser escapou usando quer referências de caracteres numéricos ou as cordas "&" e "<" respectivamente. O suporte de ângulo direito (>) Pode ser representada utilizando o string ">", e deve, por compatibilidade, ser escapou usando ">" Ou uma menção personagem quando ele aparece na string "]]>" em conteúdo, quando essa string não é marcando o fim de uma seção CDATA.

Você pode ignorar a codificação se você usar CDATA:

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

Qual versão do JRE que você está correndo? Sax Projeto diz:

J2SE 1.4 empacota uma versão antiga do SAX2. Como posso fazer SAX2 r2 ou mais tarde disponíveis?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top