Разбор неверных амперсандов с помощью Android XmlPullParsers - PullRequest
7 голосов
/ 16 февраля 2010

Я пишу небольшое приложение для очистки экрана, которое использует некоторый 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 ]

6 голосов
/ 17 ноября 2010

Я застрял на этом около часа, прежде чем выяснил, что в моем случае это «&» не может быть решено с помощью 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. Надеюсь, это поможет.

2 голосов
/ 16 февраля 2010

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

...