Pergunta

Estou escrevendo um pequeno aplicativo de raspagem de tela que consome algum xhtml - não é preciso dizer que o XHTML é inválido: os ampeiros e não são escapados como &.

Estou usando o Android's XmlPullParser e apresenta o seguinte erro no valor codificado incorretamente:

org.xmlpull.v1.XmlPullParserException: unterminated entity ref 
(position:START_TAG <a href='/Fahrinfo/bin/query.bin/dox?ld=0.1&n=3&i=9c.0323581.1266265347&rt=0&vcra'>
@55:134 in java.io.InputStreamReader@43b1ef70) 

Como faço para contornar isso? Eu pensei nas seguintes soluções:

  1. Envolvendo o InputStream em outro que substitui os amadores e por entidade refs
  2. Configurando o analisador para que ele aceite magicamente a marcação incorreta

Quais provavelmente terão mais sucesso?

Foi útil?

Solução

Eu iria com sua primeira opção, a substituição dos Ampersands parece mais uma solução adequada do que a outra. A segunda opção parece mais um Hack Para fazê -lo funcionar aceitando uma marcação incorreta.

Outras dicas

Fiquei preso nisso por cerca de uma hora antes de descobrir que, no meu caso, era o "&" que não pôde ser resolvido pelo analisador XML Pull, então encontrei a solução. Então, aqui está um trecho de código que o corrige totalmente.

void ParsingActivity(String r) {
    try {
        parserCreator = XmlPullParserFactory.newInstance();
        parser = parserCreator.newPullParser();
        // Here we give our file object in the form of a stream to the
        // parser.
        parser.setInput(new StringReader(r.replaceAll("&", "&amp;")));
        // as a SAX parser this will raise events/callback as and when it
        // comes to a element.
        int parserEvent = parser.getEventType();
        // we go thru a loop of all elements in the xml till we have
        // reached END of document.
        while (parserEvent != XmlPullParser.END_DOCUMENT) {
            switch (parserEvent) {
            // if u have reached start of a tag
            case XmlPullParser.START_TAG:
                // get the name of the tag
                String tag = parser.getName();

praticamente o que estou fazendo, estou apenas substituindo o & com &amp; Desde que eu estava lidando com a análise de um URL. Espero que isto ajude.

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