Ошибка синтаксического анализа kxml2 org.xmlpull.v1.XmlPullParserException - PullRequest
0 голосов
/ 18 февраля 2012

У меня следующая структура 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 Ответ

0 голосов
/ 19 февраля 2012

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

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

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

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

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

...