E4Xのまとめ-その1-
Flex大好き。橋本です。
さて、今日はFlexでXMLデータを操作するために使用する「E4X」の使用方法についてまとめていきたいと思います。
(個人的な備忘目的だったりします。。)
書いてるうちに長くなってしまったため、2回に分けていきたいと思います。
まず、E4Xとは何かと言いますと、ECMAScript3 のXML データを扱うための拡張仕様のことです。
E4Xでは、XMLデータは、AS3のネイティブデータ型である、XML型とXMLList型、それぞれのクラスであるXMLクラスとXMLListクラスで表されます。
各XMLインスタンスは、次の5種のXMLの内容のいずれかを表します。
・エレメント
・属性
・テキストノード
・コメント
・処理命令
XMLListは、一つ、または複数のXMLインスタンスの集まりです。
XMLエレメントが子エレメントをや子テキストノードをもつ場合には、子はその親のXMLインスタンスによって、XMLList内に包含されます。
・XMLデータの初期化方法
1.リテラル形式でXMLデータを記述する
var xml:XML = <sample attr="hogehoge">
<hoge>hogehogehoge</hoge>
<fuga>fugafugafuga</fuga>
</sample>;
インスタンス作成時には、文字列で指定することも可能です。
var str:String = '<sample attr="hogehoge"><hoge>hogehogehoge</hoge><fuga>fugafugafuga</fuga></sample>';
var xml = new XML(str);
ダイナミックにエレメントの内容を指定することも可能です。
var rootName:String = "sample";
var rootAttrName:String = "attr";
var rootAttrVal:String = "hogehoge";
var elementNames:Array = ["hoge", "fuga"];
var elementVals:Array = ["hogehogehoge", "fugafugafuga"];
var xml:XML = <{rootName} {rootAttrName}={rootAttrVal}>
<{elementNames[0]}>{elementVals[0]}</{elementNames[0]}>
<{elementNames[1]}>{elementVals[1]}</{elementNames[1]}>
</{rootName}>
・XMLデータへのアクセス方法
以下の二種類の方法があります。
1.メソッドの利用
attribute()
attributes()
child()
children()
comments()
descendants()
elements()
parent()
processingInstructions()
text()
等
2.変数スタイルのアクセス方法の利用
ドット演算子(.)
属性演算子(@)
子孫演算子(..)
・具体的なアクセス方法
var xml:XML = <nodes attr="hogehoge">
<hoge>hogehogehoge</hoge>
<fuga>fugafugafuga</fuga>
</nodes>;
//ルートへのアクセス
hogeFunc(xml);
//(hgoeFunc(xml.nodes)は間違い。<nodes>エレメントは、xmlノードの子ではありません)
//子ノードへのアクセス
xml.children(); //<nodes>の子ノードを表すXMLListを返す
xml.* //プロパティワイルドカードを使用することも可能
//特定の子へのアクセス
xml.children()[0]
xml.*[0]
//最初の子へのアクセス
xml.children()[0]
//最後の子へのアクセス
xml.children()[xml.children().length() - 1]
//名前でアクセス
xml.child("hoge") //"hoge"という名前の<nodes>ノードの子エレメントを全て返す
xml.hoge
同じ名前のノードが二つ以上ある場合には、2つのXMLエレメントを持ったXMLListエレメントが返ってきます
var xml:XML = <nodes>
<node>hoge</node>
<node>fuga</node>
</nodes>;
xml.node[0] // "hoge"
xml.node[1] // "fuga"
結果が一つしか無い場合は、XMLエレメントを一つだけ含んだXMLListが返ってくるのですが、この場合には、XMLListをXMLオブジェクトのように扱うことができます。
var xml:XML = <nodes>
<node>hoge</node>
</nodes>;
xml.node // "hoge"
・テキストノードへのアクセス
var xml:XML = <nodes>
<node1>hoge</node1>
<node2>fuga</node2>
</nodes>;
//XMLインスタンスとして参照する場合
var hoge:XML = xml.node1.children()[0]
var hoge:XML = xml.node1.*[0]
//Stringとしてアクセスしたい場合
var hoge:String = xml.node1.toString()
(xml.node1[0].toString())
//toStringメソッドは省略可能です。
var hoge:String = xml.node1
//まとめてテキストノードだけを取得することもできます
xml.*.text()
xml.*.text()[0] // "hoge"
xml.*.text()[1] // "fuga"
・親ノードへのアクセス
var xml:XML = <nodes>
<node1>hoge</node1>
<node2>fuga</node2>
</nodes>;
var hoge:XML = xml.node1[0]
hoge.parent() // <nodes>へのアクセス
parent()を続けて使用することも可能です。
var xml:XML = <nodes>
<node1>
<node2>fuga</node2>
</node1>
</nodes>;
var node2 = xml.node1.node2[0]
node2.parent().parent() // <nodes>エレメント
属性を表すXMLインスタンス上で呼び出されると、その属性が定義されているエレメントを返します
var xml:XML = <nodes>
<node1 attr="fuga">hoge</node1>
</nodes>;
xml.@attr.parent // <node1>エレメント
・属性へのアクセス
var xml:XML = <nodes attr="fuga">
<node1>hoge</node1>
</nodes>;
xml.attributes() //<nodes>の全ての属性を表すXMLListを返す
// 属性ワイルドカードを使用することも可能です
xml.@*
// 特定の属性へのアクセス
xml.attribute("attr")
// 変数シンタックス
xml.@attr
// (本当は、xml.@attr[0]。一つしかない場合は、[0]を省略できる)
// 属性の値へアクセスするとき
var hoge:String = xml.@attr.toString()
// toString()は省略出来ます
var hoge:String = xml.@attr
・コメントへのアクセス
デフォルト設定では、E4Xパーサはコメントを無視します。
コメントにアクセスするようにするには、XML.ignoreCommentsをfalseにする必要があります。
XML.ignoreCommentsはstaticな変数なので、クラスに対して設定する必要があります。
XML.ignoreComments = false;
var xml:XML = <nodes attr="fuga">
<!-- これはコメントです -->
<node1>hoge</node1>
</nodes>;
trace(xml.comments()[0]) // "これはコメントです"
・イテレーションによるアクセス
var xml:XML = <nodes>
<node1>hoge</node1>
<node2>fuga</node2>
<node3>foo</node3>
</nodes>;
for each(var a:XML in xml) {
trace(a); // "hoge", "fuga", "foo"
}
というわけで、今日は基本的な部分についてまとめてみました。
次回は、子孫ノードへのアクセス、条件判定などについて、突っ込んで行こうと思います。