我在我当前的应用程序中做了很多 XML 解析,这个例子很有帮助。
设计方面,我相信您应该使用自定义 SAX 处理程序,而不是 toasts 或意图广播等,它将在开始 XML 元素处实例化 Parse 对象。此对象是您的 XML 项的表示。所以也许这个对象会是 Car 并且有一个用于 Door、Color、Wheels 的 setter/getter。当您在 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 对象数组,这些对象被传递回活动。这是一个比使用 toast 或广播更好的解决方案,因为它是一个更加解耦的解决方案
编辑 2:我链接的网站第二页上的第一篇文章提到了解析多个 XML 元素,比如我的。请参见此处(解析多个 xml 元素)。
我希望这可以帮助你