问题
Hi i have an android application and i want to get a data from xml file. i have use SAX parser but there is some problem to get data from this type of xml file given here, so please given me the solution for parse the following xml file using SAX parsing
my xml file is here
<?xml version="1.0" encoding="utf-8"?>
<xml>
<movie>
<file>
<type>1</type>
<url>http://www.mauitheatre.com/</url>
<path>http://64.250.238.26:1111/clips/UlalenaSplashAdd.jpg</path>
<title>UlalenaSplash</title>
</file>
<file>
<type>0</type>
<path>http://64.250.238.26:1111/clips/BaldwinBeach.mp4</path>
<title>Baldwin Beach</title>
</file>
</movie>
<movie>
<file>
<type>0</type>
<url></url>
<path>http://64.250.238.26:1111/clips/AppTeaser.mp4</path>
<title>SlackKeyShow</title>
</file>
<file>
<type>0</type>
<path>http://64.250.238.26:1111/clips/BigBeach.mp4</path>
<title>Big Beach</title>
</file>
</movie>
<movie>
<file>
<type>1</type>
<url>http://www.mountainapplecompany.com/new-releases/keola-beamer-and-raiatea</url>
<path>http://64.250.238.26:1111/clips/raiateaADD.jpg</path>
<title>Raiatea Keola Beamer add</title>
</file>
<file>
<type>0</type>
<path>http://64.250.238.26:1111/clips/CharleyYoungBeach.mp4</path>
<title>Charley Young Beach</title>
</file>
</movie>
<movie>
<file>
<type>1</type>
<url>http://www.bennyuyetake.com</url>
<path>http://64.250.238.26:1111/clips/BennyUyetake.jpg</path>
<title>Benny Uyetake SPlash</title>
</file>
<file>
<type>0</type>
<path>http://64.250.238.26:1111/clips/HamoaBeach-1.mp4</path>
<title>Hamoa Beach</title>
</file>
</movie>
<movie>
<file>
<type>1</type>
<url>http://www.dericksebastian.com</url>
<path>http://64.250.238.26:1111/clips/DSSplash.jpg</path>
<title>DS Splash</title>
</file>
<file>
<type>0</type>
<path>http://64.250.238.26:1111/clips/HanaBay.mp4</path>
<title>Hana Bay</title>
</file>
</movie>
<movie>
<file>
<type>1</type>
<url>http://www.mountainapplecompany.com/new-releases/keola-beamer-and-raiatea</url>
<path>http://64.250.238.26:1111/clips/raiateaADD.jpg</path>
<title>Raiatea Keola Beamer add</title>
</file>
<file>
<type>0</type>
<path>http://64.250.238.26:1111/clips/KamaoleBeachPark1b-1.mp4</path>
<title>Kamaole Beach Park 1</title>
</file>
</movie>
</xml>
回答1:
Assuming that you need an ArrayList<Movie>
, where the structure of the Movie
class is
public class Movie
{
private ArrayList<File> files;
public Movie()
{
this.files = new ArrayList<File>();
}
}
and the File
's structure is
public class File
{
private int type;
private String url;
private String path;
private String title;
}
with the necessary getter
and setter
functions, you can get the desired list by
final SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
final MovieXmlHandler handler = new MovieXmlHandler();
parser.parse(new InputSource(new StringReader(yourXmlString)), handler);
final ArrayList<Movie> movies = handler.getRecords();
where
yourXmlString
is the xml data you've pasted above, andhandler
is a MovieXmlHandler instance.
MovieXmlHandler implementation:
public class MovieXmlHandler extends DefaultHandler
{
private static final String TAG_MOVIE = "movie";
private static final String TAG_FILE = "file";
private static final String TAG_TYPE = "type";
private static final String TAG_URL = "url";
private static final String TAG_PATH = "path";
private static final String TAG_TITLE = "title";
private String currentNodeName;
private Movie currentMovie;
private File currentFile;
private ArrayList<Movie> records = null;
private String elementValue;
public ArrayList<Movie> getRecords()
{
return records;
}
@Override
public void startDocument() throws SAXException
{
super.startDocument();
this.records = new ArrayList<Movie>();
}
@Override
public void startElement(final String Uri, final String localName,
final String qName, final Attributes att) throws SAXException
{
if (localName != null)
currentNodeName = localName;
}
@Override
public void characters(final char[] ch, final int start,
final int length) throws SAXException
{
if (this.currentNodeName == null)
return;
this.elementValue = new String(ch, start, length).trim();
if (this.currentNodeName.equalsIgnoreCase(TAG_MOVIE))
this.currentMovie = new Movie();
if (this.currentNodeName.equalsIgnoreCase(TAG_FILE))
this.currentFile = new File();
else if (this.currentNodeName.equalsIgnoreCase(TAG_TYPE))
this.currentFile.setType(Integer.parseInt(this.elementValue));
else if (this.currentNodeName.equalsIgnoreCase(TAG_URL))
this.currentFile.setUrl(this.elementValue);
else if (this.currentNodeName.equalsIgnoreCase(TAG_PATH))
this.currentFile.setPath(this.elementValue);
else if (this.currentNodeName.equalsIgnoreCase(TAG_TITLE))
this.currentFile.setTitle(this.elementValue);
}
@Override
public void endElement(final String Uri, final String localName,
final String qName) throws SAXException
{
if (localName.equalsIgnoreCase(TAG_MOVIE))
{
if (this.currentMovie != null)
this.records.add(this.currentMovie);
}
else if (localName.equalsIgnoreCase(TAG_FILE))
{
if ((this.currentMovie != null) && (this.currentFile != null))
this.currentMovie.getFiles().add(this.currentFile);
}
currentNodeName = null;
}
}
Of course, if you have only the url of your xml data (xmlUrl:String
), you can use
final URL sourceUrl = new URL(xmlURL);
final SAXParser sp = SAXParserFactory.newInstance().newSAXParser();
final XMLReader reader = sp.getXMLReader();
final MovieXmlHandler handler = new MovieXmlHandler();
reader.setContentHandler(handler);
reader.parse(new InputSource(sourceUrl.openStream()));
final ArrayList<Movie> movies = handler.getRecords();
and if you have your xml data available from an in:InputStream
, then
final SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
final MovieXmlHandler handler = new MovieXmlHandler();
parser.parse(in, handler);
final ArrayList<Movie> movies = handler.getRecords();
Let us know if this isn't what you were looking for.
回答2:
The real problem is that you are trying to use a SAX parser yourself; which makes life harder than it needs to be. If possible, why not rely on an Annotation based XML parsing framework like the Simple XML Library?
I just wrote a blog post on how to include it in your Android projects.
回答3:
The problem is probably that the <xml>
tag is not closed. To be able to parse the file, it must be a well-formed XML file, so try to add </xml>
at the end and give it another try.
来源:https://stackoverflow.com/questions/5730498/sax-parsing-progblem-in-android