AndroidにはXMLを読み込みながらストリーミング処理するXmlPullParser APIと、XML文書を全て読みこんでから処理するDOM (Document) APIがあります。
基本的には目的に応じて好きな方を使えばよいのですが、R.xmlリソースIDからXMLを取得するContext.getResources().getXml()はXmlPullParserしか取得できないため、そのままではDOM APIを用いて実装した処理に渡すことができません。そこで、XmlPullParserからDocumentを作成する処理を作りました。
Document from(XmlPullParser parser) throws ParserConfigurationException, IOException, XmlPullParserException {
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Node parent = document;
int type;
while (true) {
type = parser.next();
if (type == XmlPullParser.END_DOCUMENT) break;
switch (type) {
// タグの開始
case XmlPullParser.START_TAG:
Element element = document.createElement(parser.getName());
// 要素の属性を設定
for (int i = 0; i < parser.getAttributeCount(); i++) {
String attr = parser.getAttributeName(i);
String value = parser.getAttributeValue(i);
element.setAttribute(attr, value);
}
// 親に追加
parent.appendChild(element);
// 自分を親にする
parent = element;
break;
// タグの終了
case XmlPullParser.END_TAG:
// 親の親が次の親
parent = parent.getParentNode();
break;
}
}
return document;
}
DOMのAPIはAndroidではなく標準のJavaにも含まれているので、Android以外にも利用可能なXML処理を実装するのにはDOMのAPIを使った方が便利かもしれませんね。