以前、XMLParserを使ってXMLをパースする記事を書いたが(XMLParserを使う その1、XMLParserを使う その2)、テキストやアトリビュートの取り出し方が今ひとつわからなかった。
そこで、別の方法---というよりこちらの方が正当なやり方かもしれないが---、.NETのXmlDocument()を使ってパースする方法を行なった。
注)以下、Xml...と言うクラスが出てくるが、'X'は大文字、'ml'は小文字。以前のXMLParserでは、'XML'と全て大文字で同じ名前のメソッドがあるので、混乱しないように。UnityEditorがオートコンプリートで勝手に大文字に変換してしまうので、XMLParserクラスはプロジェクトから削除したほうがよいだろう。
作成したスクリプトのフルリストは次のようになる。
#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"から、その名前を出力する。
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
上述の古リストを実行した際の出力は次の通り(注:下の方は画面から切れている)。