Разбор неверных амперсандов с помощью Android XmlPullParsers

Я пишу небольшое приложение для очистки экрана, которое использует некоторый XHTML - само собой разумеется, что XHTML недействителен: амперсанды не экранируются как &,

Я использую Android XmlPullParser и выдает следующую ошибку при неверно закодированном значении:

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) 

Как мне обойти это? Я думал о следующих решениях:

  1. Упаковка InputStream в другом, который заменяет амперсанды ссылками на сущности
  2. Настройка парсера так, чтобы он волшебным образом принимал неправильную разметку

Какие из них могут быть более успешными?

2 ответа

Решение

Я бы выбрал ваш первый вариант, замена амперсандов кажется более подходящим решением, чем другие. Второй вариант кажется более хакерским, чтобы заставить его работать, приняв неправильную разметку.

Я застрял на этом около часа, прежде чем понял, что в моем случае это "&" не может быть решено с помощью XML PULL PARSER, поэтому я нашел решение. Итак, вот фрагмент кода, который полностью исправляет это.

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

в значительной степени то, что я делаю, я просто заменяю & с &amp; так как я имел дело с разбором URL. Надеюсь это поможет.

Другие вопросы по тегам