Предполагая, что вам нужен ArrayList<Movie>
, где структура класса Movie
равна
public class Movie
{
private ArrayList<File> files;
public Movie()
{
this.files = new ArrayList<File>();
}
}
и структура File
public class File
{
private int type;
private String url;
private String path;
private String title;
}
с необходимыми функциями getter
и setter
, вы можете получить желаемый список с помощью
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();
, где
yourXmlString
это данные xml
Вы вставили выше, и
handler
- MovieXmlHandler
экземпляр.
Реализация MovieXmlHandler:
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;
}
}
Конечно, если у вас есть только URL ваших XML-данных (xmlUrl:String
), вы можете использовать
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();
и если у вас есть данные xml, доступные с in:InputStream
, тогда
final SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
final MovieXmlHandler handler = new MovieXmlHandler();
parser.parse(in, handler);
final ArrayList<Movie> movies = handler.getRecords();
Дайте нам знать, если это не то, что вы искали.