2012-02-18 97 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 {}空包(位置: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 2012-02-26 07:28:57