Как правильно обрабатывать пространства имен с помощью XmlPullParser в Android при анализе XML? - PullRequest
0 голосов
/ 24 декабря 2018

Я постараюсь быть максимально кратким.Я пытаюсь обработать файлы KML (XML) с помощью XmlPullParser в моем приложении Android.У меня это работает довольно хорошо, но я зацикливаюсь на пространствах имен.

Я запускаю свой синтаксический анализатор следующим образом:

public void parse(FileInputStream in) throws XmlPullParserException, IOException {
    try {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        factory.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);
        XmlPullParser parser = factory.newPullParser();
        parser.setInput(in, null);
        parser.nextTag();
        readKML(parser);
    } finally {
        in.close();
    }
}

Затем программа выполняет различные проверки тегов, которые я установил, и правильно возвращает все значения, пока она не получит частьXML, использующий пространства имен (xal):

<Folder>
            <name>Family &amp; Friends</name>
            <description>Locations of family members and friends.</description>
            <Placemark>
                <name>Fred and Marthas House</name>
                <description></description>
                <Point>
                    <coordinates>-55.55559,55.55555,120.0</coordinates>
                </Point>
                <xal:AddressDetails>
                    <xal:Country>
                        <xal:CountryName>United States</xal:CountryName>
                        <xal:CountryNameCode>US</xal:CountryNameCode>
                        <xal:AdministrativeArea>
                            <xal:AdministrativeAreaName>Michigan</xal:AdministrativeAreaName>
                            <xal:Locality>
                                <xal:LocalityName>Lawton</xal:LocalityName>
                                <xal:Thoroughfare>
                                    <xal:ThoroughfareNumber></xal:ThoroughfareNumber>
                                    <xal:ThoroughfareName>45th Street</xal:ThoroughfareName>
                                </xal:Thoroughfare>
                                <xal:PostalCode>
                                    <xal:PostalCodeNumber></xal:PostalCodeNumber>
                                </xal:PostalCode>
                            </xal:Locality>
                        </xal:AdministrativeArea>
                    </xal:Country>
                </xal:AddressDetails>

Я обрабатываю каждое отдельное значение XML следующим образом:

// Processes title tags in the feed.
private String readCountryNameCode(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, NS, G.KML.COUNTRY_NAME_CODE);
    String countryCode = readText(parser);
    Log.d(TAG, "Found CountryNameCode value under Country tag");
    parser.require(XmlPullParser.END_TAG, NS, G.KML.COUNTRY_NAME_CODE);
    return countryCode;
}

Как только он попадает в часть пространства имен xml, он начинает злиться.Трассировка стека говорит:

2018-12-24 12:59:43.026 1884-2314/OBFUSCATED_PERSONAL_INFO W/System.err: org.xmlpull.v1.XmlPullParserException: expected: START_TAG {null}CountryNameCode (position:END_TAG </{urn:oasis:names:tc:ciq:xsdschema:xAL:2.0}xal:Country>@30:21 in java.io.InputStreamReader@9f81207) 
2018-12-24 12:59:43.027 1884-2314/OBFUSCATED_PERSONAL_INFO W/System.err:     at org.kxml2.io.KXmlParser.require(KXmlParser.java:2067)
2018-12-24 12:59:43.027 1884-2314/OBFUSCATED_PERSONAL_INFO W/System.err:     at OBFUSCATED_PERSONAL_INFO.KML_Import_Pull.readCountryNameCode(KML_Import_Pull.java:470)

Итак, затем я явно указал пространство имен в операторе .require, где читаются значения:

// Processes title tags in the feed.
private String readCountryNameCode(XmlPullParser parser) throws IOException, XmlPullParserException {
    parser.require(XmlPullParser.START_TAG, "xal", G.KML.COUNTRY_NAME_CODE);
    String countryCode = readText(parser);
    Log.d(TAG, "Found CountryNameCode value under Country tag");
    parser.require(XmlPullParser.END_TAG, "xal", G.KML.COUNTRY_NAME_CODE);
    return countryCode;
}

Трассировка стека изменилась незначительно, но все ещеболее или менее та же самая ошибка:

2018-12-24 13:12:48.615 3842-4769/OBFUSCATED_PERSONAL_INFO W/System.err: org.xmlpull.v1.XmlPullParserException: expected: START_TAG {xal}CountryNameCode (position:START_TAG <{urn:oasis:names:tc:ciq:xsdschema:xAL:2.0}xal:CountryNameCode>@16:29 in java.io.InputStreamReader@eaf421) 
2018-12-24 13:12:48.615 3842-4769/OBFUSCATED_PERSONAL_INFO W/System.err:     at org.kxml2.io.KXmlParser.require(KXmlParser.java:2067)
2018-12-24 13:12:48.615 3842-4769/OBFUSCATED_PERSONAL_INFO W/System.err:     at OBFUSCATED_PERSONAL_INFO.KML_Import_Pull.readCountryNameCode(KML_Import_Pull.java:470)

Моя единственная другая мысль - это то, что XML искажен, но другие приложения обрабатывают его просто отлично, и, по крайней мере, первые несколько записей выглядят хорошо сформированными.Я просмотрел их вручную, а также использовал другое приложение для двойной проверки. edit Я использовал онлайновый xml validator , и он не выдал никаких ошибок при проверке документа

Я что-то упустил при настройке фабрики XmlPullParser, готовящей его к этомупространство имен xal?

1 Ответ

0 голосов
/ 25 декабря 2018

Проблема была программной, у меня два ошибочно размещенных файла parser.nextTag дальше по дереву, которое вызвало ошибки.

...