Ошибка синтаксического анализа kxml2 org.xmlpull.v1.XmlPullParserException

У меня есть следующая структура XML:

<?xml version="1.0" encoding="utf-8"?>
<Packages SyncId="634651745071815748" xmlns:xsd="http://www.w3.org/2001/XMLSchema"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Package Id="1848f7cc-0ced-fbb7-140e-b485d28c207f" Title="Active Directory" AvailableContentType="ReportsOnly" Badge="0">
<Icon Id="960EE89A85EAD6244DAEC389A7103F3A5FBB4EC3"/>
</Package>
<Package Id="b923bf10-3a79-a7dc-64dc-9cd875233a3a" Title="Exchange 2007" AvailableContentType="ReportsOnly" Badge="0">
<Icon Id="4999D5496086D802FC261F953DDB50B167431E45"/>
</Package>
<Package Id="367f0d4b-4656-c628-b75f-26535dfa505c" Title="Exchange 2010" AvailableContentType="ReportsOnly" Badge="0">
<Icon Id="320E1D9563CA8FE09FA43D8325F7E9F02BC88737"/></Package>
<Package Id="2c088847-b1ca-a9f7-29a4-a3fbc8cd3445" Title="Local System" AvailableContentType="ReportsOnly" Badge="0">
<Icon Id="FA9BA4CA8B5E626304EDD5323DE252DC0D3F6087"/>
</Package>
<Package Id="9ac614f7-e67b-5f98-3197-49de0469fd3b" Title="Network" AvailableContentType="ReportsOnly" Badge="0">
<Icon Id="B9B35308E738346CA68970BAB2CEC31B4047983F"/>
</Package>
<Package Id="1bac78ad-7834-5549-b775-0ecc7f29b1ae" Title="Routing Table" AvailableContentType="ReportsOnly" Badge="0">
<Icon Id="ABA86D564A461201C0B39785D7A68A3C2CEA4CAD"/>
</Package>
</Packages

Я хочу разобрать этот XML. Я написал этот код:

public static Packages Parse(String packages)
{
     Packages packs = new Packages();
     Document doc= new Document();

     byte[] xmlByteArray = packages.getBytes();

     ByteArrayInputStream xmlStream = new ByteArrayInputStream(xmlByteArray);
     xmlStream.reset();
     //xmlStream.reset();
     InputStreamReader xmlReader = new InputStreamReader(xmlStream);


     //packages = StringHelper.replace(packages, "<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
     //packages = StringHelper.replace(packages, " xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"", "");
     KXmlParser parser = new KXmlParser();

     try {
        parser.setInput(xmlReader);

    } catch (XmlPullParserException e) {
        e.printStackTrace();
    }
     try {

        doc.parse(parser);
        xmlReader.reset();
        String posDesc = parser.getPositionDescription();
        **int token = parser.nextTag();**
        parser.require(XmlPullParser.START_TAG, null, "Packages");
        if (parser.getAttributeCount()>0)
        {
            if (parser.getAttributeName(0)=="SyncId") packs.SyncId = parser.getAttributeValue(0); 
        }
        while(parser.nextTag()!=XmlPullParser.END_DOCUMENT)
        {
            parser.require(XmlPullParser.START_TAG, null, "Package");
            Package pack = new Package();
            int packAttrCount = parser.getAttributeCount();
            if(packAttrCount>0)
            {
                for(int i=0; i<packAttrCount; i++)
                {
                    if (parser.getAttributeName(i)=="Id") pack.Id=parser.getAttributeValue(i);
                    else
                        if (parser.getAttributeName(i)=="Title") pack.Title=parser.getAttributeValue(i);
                        else
                            if (parser.getAttributeName(i)=="AvailableContentType") pack.AvailableContentType=parser.getAttributeValue(i);
                            else
                                if (parser.getAttributeName(i)=="Badge") pack.Badge=parser.getAttributeValue(i);

                }
            }
            parser.next();
            parser.require(XmlPullParser.START_TAG, null, "Icon");
            Icon icon = new Icon();
            if (parser.getAttributeCount()>0)
            {
                if (parser.getAttributeName(0)=="Id") icon.Id=parser.getAttributeValue(0);
            }
            parser.nextTag();
            if (parser.getName()=="Data") icon.Data=parser.getText();
            pack.Icon = icon;
            packs.Packs.addElement(pack);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    }

Первый вызов parser.next() всегда возвращает END_DOCUMENT, и соответственно я получаю исключение в методе require.

org.xmlpull.v1.XmlPullParserException: ожидается: START_TAG {null} Пакеты (позиция:END_DOCUMENT null@1:1268 в java.io.InputStreamReader@bd3ab6b6)

Что я делаю не так? Заранее спасибо!

1 ответ

Удалить звонок doc.parse(parser); из вашего кода.

С kXML вы либо анализируете XML с помощью

  1. Document#parse() метод
    или же
  2. с помощью API XML pull с использованием цикла

Вы пытались сделать оба. После звонка doc.parse(parser) Вы автоматически продвинулись до конца документа XML (и достигли XmlPullParser.END_DOCUMENT tag). Сразу после этого вы попытались снова проанализировать XML, используя второй метод.

Судя по вашему коду, вы решили использовать второй метод, поэтому вам следует избавиться от вызова doc.parser(parser),

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