読者です 読者をやめる 読者になる 読者になる

Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

XmlDocument()でXMLをパースする その1

以前、XMLParserを使ってXMLをパースする記事を書いたが(XMLParserを使う その1XMLParserを使う その2)、テキストやアトリビュートの取り出し方が今ひとつわからなかった。

そこで、別の方法---というよりこちらの方が正当なやり方かもしれないが---、.NETのXmlDocument()を使ってパースする方法を行なった。

注)以下、Xml...と言うクラスが出てくるが、'X'は大文字、'ml'は小文字。以前のXMLParserでは、'XML'と全て大文字で同じ名前のメソッドがあるので、混乱しないように。UnityEditorがオートコンプリートで勝手に大文字に変換してしまうので、XMLParserクラスはプロジェクトから削除したほうがよいだろう。

パースの対象は次のTwitterXML
f:id:yasuda0404:20120808172811p:plain



作成したスクリプトのフルリストは次のようになる。

#pragma strict
import System.Xml;
//Ref.   http://dev.grumpyferret.com/unity/

var url1 = "http://twitter.com/statuses/user_timeline/ataro44.xml";	//my twitter post list
private var val:String;

function Start () {
	Debug.Log("XMLをパースする");
	var getXML : WWW = new WWW(url1);
 	yield getXML;
 	
	if (getXML.error != null) {
		Debug.Log("XML not read:"+url1);
	}else{
		//XML available
		Debug.Log("XML read");
 		Debug.Log( getXML.text );
		var xmlDoc:XmlDocument = new XmlDocument();
		xmlDoc.LoadXml(getXML.text);	//read into XmlDocument from getXML
		var statusList:XmlNodeList = xmlDoc.GetElementsByTagName("status");
		
		for (var stat:XmlNode in statusList){
			var statchild:XmlNodeList = stat.ChildNodes;
			for (var content:XmlNode in statchild){
				print(content.Name);
			}
		}
	}
}


以下、解説する。
まず、スクリプトの冒頭に

import System.Xml;

を記述。これでXmlDocumentファミリーのクラスが使えるようになる。

XMLをwwwクラスのインスタンスに読み込む。(WWWクラスでXMLテキストデータを読む方法はWWWクラスで外部ファイルを読みこむ - Unityな日々(Unity Geek)を参照のこと。)

var xmlDoc:XmlDocument = new XmlDocument();
xmlDoc.LoadXml(getXML.text);

で、XmlDocumentのインスタンスを作り、XMLテキスト全体をロードする。

ここからはXMLの形に応じて、XmlNodeListとXmlNodeを取り出していく作業となる。

var statusList:XmlNodeList = xmlDoc.GetElementsByTagName("status");

は、読み込んだxmlDocumentから、"status"タグのXmlNodeListを作る。

次の

for (var stat:XmlNode in statusList){

は、"status"タグのXmlNodeListの各要素(=ひとつの"status"タグのかたまり)をひとつずつ取り出す。

var statchild:XmlNodeList = stat.ChildNodes;

で、その子タグのXmlNodeList、この場合、"created_at", "id", "text","source"....と言うタグのXmlNodeListを作る。さらに、

for (var content:XmlNode in statchild){

で、XmlNodeListから、それぞれのXmlNodeを取り出せる。

取り出したXmlNodeの名前は、XMLNode.Name で取得できる。例えば、

print(content.Name);

は、XMLNodeのインスタンス"content"から、その名前を出力する。

                      • -

上述の古リストを実行した際の出力は次の通り(注:下の方は画面から切れている)。
f:id:yasuda0404:20120808200741p:plain

参考:
Unity Noobs: XML - Loading data from a xml file.