XmlPullParser перейти от START_DOCUMENT к END_DOCUMENT eventType - PullRequest
1 голос
/ 10 марта 2020

Я пытаюсь проанализировать xml файл в Android приложении. Когда я пытаюсь его обработать, я не получаю eventType, кроме START_DOCUMENT и END_DOCUMENT сразу после START. Похоже, я доставлю пустой файл или что-то. Странно то, что я пробовал этот код на 5 различных xml файлах, и он работал (работал, я имею в виду, я получаю разные типы событий, отличные от START и END) для поврежденного (там отсутствовали некоторые конечные теги). Я думал, что, может быть, я создал неправильные xml файлы, но я даже скачал некоторые образцы xml файлов, и это тоже не сработало.

некоторый код:

public static void parseXML(Activity activity) throws XmlPullParserException, IOException {
        XmlPullParserFactory parserFactory;
        parserFactory = XmlPullParserFactory.newInstance();
        parserFactory.setNamespaceAware(true);
        XmlPullParser parser = parserFactory.newPullParser();
        InputStream inputStream = activity.getAssets().open("XML_RENAME.xml");
        InputStreamReader isReader = new InputStreamReader(inputStream);
        BufferedReader reader = new BufferedReader(isReader);
        parser.setInput(reader);
        processParces(parser);
    }

    private static void processParces(XmlPullParser parser) throws XmlPullParserException, IOException {
        int eventType = parser.getEventType();
        String tagname = "";
        String text = "";
        while(eventType != XmlPullParser.END_DOCUMENT)
        {
            tagname = parser.getName();
            switch(eventType)
            {
                case XmlPullParser.START_TAG:
                    if (tagname.equalsIgnoreCase(KEY_REGION)) {
                    }
                    break;

                case XmlPullParser.TEXT:
                    //grab the current text so we can use it in END_TAG event
                    text = parser.getText();
                    Log.e("Text: ", text);
                    break;

                case XmlPullParser.END_TAG:
                    if (tagname.equalsIgnoreCase(KEY_SECTOR)) {
                        Log.e("XML ",KEY_SECTOR);
                    } else if (tagname.equalsIgnoreCase(KEY_DIRECTIONS)) {
                        Log.e("XML ",KEY_DIRECTIONS );
                    } else if (tagname.equalsIgnoreCase(KEY_CONDITIONS)) {
                        Log.e("XML ",KEY_CONDITIONS );
                    } else if (tagname.equalsIgnoreCase(KEY_NEIGHBORS)) {
                        Log.e("XML ",KEY_NEIGHBORS );
                    } else if (tagname.equalsIgnoreCase(KEY_CONTINUATIONS)) {
                        Log.e("XML ",KEY_CONTINUATIONS );
                    } else if (tagname.equalsIgnoreCase(KEY_BLOCKS)) {
                        Log.e("XML ",KEY_BLOCKS );
                    }
                    break;

                default:
                    break;
            }
            eventType = parser.next();
            }
        }

1 Ответ

0 голосов
/ 11 марта 2020

Я нашел проблему. Некоторые xml файлы содержат в начале несколько дополнительных байтов, которые будут указаны c "EF BB BF". Это называется спецификацией (Byte-Order-Mark). Когда xml содержит эти дополнительные байты, наш XmlPullParser не работает должным образом и ведет себя так, как будто нет события START_TAG, и переходит к END_DOCUMENT.

...