I am using a SAX Parser for an android app I am working on and I am having a hard time trying to save the name tag of Project from being overwritten. The problem here is that my name tag within the project is getting overwritten by the name tag within license since the tags are identical. The rest is getting parsed beautifully. Also, this xml is being generated by passing a GET Request to an API, so I can’t edit it. Is there a way to maybe omit the name tag within the license field or maybe try to get a sense of where I’m at inside the document which is a problem since SAX is even driven. Also, I realize that I could accomplish this pretty easily using DOM but I have come way too far now to switch to DOM. I’ve attached snippets of my XML Handling code and the xml file I am trying to parse.
Thanks
@Override
public void startElement (String namespaceURI, String localName, String qName, Attributes attributes) throws SAXException
{
buffer.setLength(0);
if (localName.equalsIgnoreCase("result"))
{
results = new ArrayList <Result> ();
}
if (localName.equalsIgnoreCase("project"))
{
result = new Result ();
}
if (localName.equalsIgnoreCase("name"))
{
result.name = buffer.toString ();
Log.v("PROJECT NAME: ", result.name);
}
} // end of startElement ()
@Override
public void endDocument () throws SAXException
{}
@Override
public void endElement (String namespaceURI, String localName, String qName) throws SAXException
{
if (localName.equalsIgnoreCase("project") || localName.equalsIgnoreCase("account"))
{
this.entries++;
results.add(result);
}
else if (localName.equalsIgnoreCase("id"))
{
result.id = buffer.toString ();
Log.v("Id: ", result.id);
}
else if (localName.equalsIgnoreCase("created_at"))
{
try
{
result.date_created = ResultHandlerProject.DATE_FORMAT.parse(buffer.toString());
}
catch (ParseException e)
{
e.printStackTrace();
}
}
else if (localName.equalsIgnoreCase("updated_at"))
{
try
{
result.date_updated = ResultHandlerProject.DATE_FORMAT.parse(buffer.toString());
}
catch (ParseException e)
{
e.printStackTrace();
}
}
else if (localName.equalsIgnoreCase("description"))
{
result.description = buffer.toString ();
}
else if (localName.equalsIgnoreCase("homepage_url"))
{
result.url_homepage = buffer.toString ();
}
else if (localName.equalsIgnoreCase("download_url"))
{
result.url_download = buffer.toString ();
}
else if (localName.equalsIgnoreCase("medium_logo_url"))
{
result.image_link = buffer.toString ();
}
else if (localName.equalsIgnoreCase("user_count"))
{
result.user_count = buffer.toString ();
}
else if (localName.equalsIgnoreCase("average_rating"))
{
result.rating = buffer.toString ();
}
else if (localName.equalsIgnoreCase("rating_count"))
{
result.rating_count = buffer.toString ();
}
else if (localName.equalsIgnoreCase("analysis_id"))
{
result.analysis_id = buffer.toString ();
}
else if (localName.equalsIgnoreCase("nice_name"))
{
result.license_full_name = buffer.toString ();
Log.v("License Full Name: ", result.license_full_name);
}
} // end of endElement ()
Sample XML File:
<result>
<project>
<id>6050</id>
<name>FirePHP</name>
<created_at>2007-06-16T04:03:13Z</created_at>
<updated_at>2012-07-01T15:05:23Z</updated_at>
<description>
FirePHP
<homepage_url>http://www.firephp.org/</homepage_url>
<download_url>http://www.firephp.org/</download_url>
<url_name>FirePHP</url_name>
<medium_logo_url>
https://s3.amazonaws.com/cloud.ohloh.net/attachments/6638/FirePHP_Large_White_med.png
</medium_logo_url>
<small_logo_url>
https://s3.amazonaws.com/cloud.ohloh.net/attachments/6638/FirePHP_Large_White_small.png
</small_logo_url>
<user_count>145</user_count>
<average_rating>4.11765</average_rating>
<rating_count>34</rating_count>
<analysis_id>8910317</analysis_id>
<licenses>
<license>
<name>bsd</name>
<nice_name>BSD Copyright</nice_name>
</license>
</licenses>
</project>
You can resolve your issue in a simple way.
Create some flags into your class handler.
Control these flags like I show you below.
Let me know if it works.