アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

E4Xのまとめ-その1-

Flex大好き。橋本です。

さて、今日はFlexXMLデータを操作するために使用する「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"
}


というわけで、今日は基本的な部分についてまとめてみました。
次回は、子孫ノードへのアクセス、条件判定などについて、突っ込んで行こうと思います。