I have following xml structure:
<?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
I want to parse this xml. I wrote this code:
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();
}
First call parser.next() always return END_DOCUMENT and appropriately I receive exception in require method.
org.xmlpull.v1.XmlPullParserException: expected: START_TAG {null}Packages (position:END_DOCUMENT null@1:1268 in java.io.InputStreamReader@bd3ab6b6)
What I'm doing wrong? Thanks in advance!
Remove the call to
doc.parse(parser);from your code.With kXML you either parse the XML with
Document#parse()methodor
You tried to do both. After the call to
doc.parse(parser)you automatically advanced to the end of the XML document (and reached theXmlPullParser.END_DOCUMENT tag). Immediately after that you tried to parse the XML again using the second method.Judging by your code, you decided to use the second method, therefore, you should get rid of the call to
doc.parser(parser).