2012-02-18 2 views
-1

Я следующую структуру XML:kxml2 разборе ошибок org.xmlpull.v1.XmlPullParserException

<?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 и соответствующим образом я получаю исключение в методе требует.

org.xmlpull.v1.XmlPullParserException: ожидаемое START_TAG {NULL} Пакеты (позиция: END_DOCUMENT нулевой @ 1: 1268 в [email protected])

Что я делаю неправильно? Спасибо заранее!

ответ

0

Удалите звонок по номеру doc.parse(parser);.

С kXML вы либо разобрать XML с

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

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

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

+0

@olegk Был ли мой ответ решён с вашей проблемой? – mrvincenzo