私は現在のアプリでかなりの量の XML 解析を行ってきましたが、これはこの例が大いに役立ちました。
設計に関しては、トーストやインテント ブロードキャストなどの代わりに、最初の XML 要素で Parse オブジェクトをインスタンス化するカスタム SAX ハンドラを使用する必要があると思います。このオブジェクトは、XML アイテムの表現です。したがって、オブジェクトは Car で、Door、Color、Wheels のセッター/ゲッターを持つ場合があります。SAX パーサーでデータを解析するときに、これらの値を設定します。SAX パーサーが解析を終了したら、パーサーを呼び出して、XML からのすべての車でいっぱいになっているアクティビティにオブジェクトを戻します。私の場合、実際に返されるオブジェクトのリスト/配列を作成します。この例では、1 セットのデータのみを扱います。とにかく、そのリンクはそれをすべて説明しています。
編集:コードを見ただけで、実際にハンドラーで行うことは、解析が完了した後にアクティビティに返される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要素を解析します)。
これがお役に立てば幸いです