В моем текущем приложении я довольно много разобрал XML, и этот пример очень помог.
Проектируйте мудро, я верю, что вместо тостов или намеренной трансляции и т. Д. Вы должны использовать пользовательский обработчик SAX, который будет создавать экземпляр объекта Parse в начальном XML-элементе. Этот объект является представлением ваших элементов XML. Так что, возможно, объект будет Car и имеет установщик / получатель для Door, Color, Wheels. При разборе данных в парсере SAX вы будете устанавливать эти значения. когда анализатор SAX заканчивает анализ, вы вызываете свой анализатор, чтобы он передал объект вашей деятельности, заполненный всеми машинами из вашего XML. В моем случае я фактически заполняю список / массив моих объектов, которые передаются обратно. В примере рассматривается только один набор данных. Во всяком случае, эта ссылка объясняет все это.
Редактировать: просто смотрел на мой код, на самом деле то, что я делаю в своем обработчике - это создание массива объектов моего набора ParsedData, которые передаются обратно в действие после завершения анализа с помощью getParsedData (). Вот несколько важных кодов:
Обработчик XML:
private boolean in_IdSite;
private boolean in_SiteName;
private ArrayList<ParsedChannelDataSet> list = new ArrayList<ParsedChannelDataSet>();
public ArrayList<ParsedChannelDataSet> getParsedData() {
return this.list;
}
@Override
public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {
// first tag parsed so add a new ParsedEventDataSet object
if(localName.equals("stmSiteUser")) {
list.add(new ParsedChannelDataSet());
} else if (localName.equals("idSite")) {
this.in_IdSite = true;
} else if (localName.equals("siteName")) {
this.in_SiteName = true;
}
}
@Override
public void endElement(String namespaceURI, String localName, String qName) throws SAXException {
if (localName.equals("idSite")) {
this.in_IdSite = false;
} else if (localName.equals("siteName")) {
this.in_SiteName = false;
}
}
@Override
public void characters(char ch[], int start, int length) {
// determine if any tag is current, get data from tag and populate into ParsedEventDataSet
if (this.in_IdSite) {
this.list.get(this.list.size()-1).setExtractedIdSite(new String(ch, start, length));
} else if (this.in_SiteName) {
this.list.get(this.list.size()-1).setExtractedSiteName(new String(ch, start, length));
}
}
Вот мой пример ParsedDataSampleSet (его можно называть как угодно), очевидно, вы хотите заменить siteName и idSite на что-то еще. Это всего лишь мои элементы XML
public class ParsedChannelDataSet {
private String extractedIdSite = null;
private String extractedSiteName = null;
public String getExtractedIdSite() {
return extractedIdSite;
}
public void setExtractedIdSite(String _extractedIdSite) {
this.extractedIdSite = _extractedIdSite;
}
public String getExtractedSiteName() {
return extractedSiteName;
}
public void setExtractedSiteName(String _extractedSiteName) {
Log.d("", _extractedSiteName);
this.extractedSiteName = _extractedSiteName;
}
public String toString() {
/* TODO */
return "todo";
}
}
Итак, вы можете видеть, что я строю массив объектов ParsedChannelDataSet, которые передаются обратно в действие. это гораздо лучшее решение, чем использование тостов или широковещательных рассылок, потому что это более несвязанное решение
Редактировать 2: В первом посте на этой 2-й странице сайта, на который я ссылался, упоминается разбор нескольких элементов XML, таких как мой. Смотрите здесь ( парсинг нескольких элементов xml ).
Надеюсь, это поможет вам