アシアルブログ

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

E4Xのまとめ-その2-

こんにちは。Flex大好き橋本です。

今回は、前回の「E4Xのまとめ-その1-」の続きということで、子孫ノードへのアクセス、値のフィルタリング、名前空間の利用についてまとめていきたいと思います。

・子孫ノードへのアクセス。
「..」を使って、子孫ノードにアクセスすることができます。



//例
var xml:XML = <root>
	<hoge>hoge1</hoge>
	<fuga>
		<hoge>hoge2</hoge>	
	</fuga>
</root>;

//前回あったとおり、「.」を使うと、直接の子ノードを取得することができます。
var a:XMLList = xml.hoge;
for each (var b:XML in a) {
	trace(b); //hoge1
} 

//「..」を使うと、「.」とは異なり、直接の子ノードだけではなく、すべての子孫ノードを取得することができます。
var a:XMLList = xml..hoge;
for each (var b:XML in a) {
	trace(b); //hoge1, hoge2
} 


・条件指定によるフィルタリング
「()」の中に条件を指定することによって、各ノードの値や属性値について、フィルタリングを行うことができます。



//例
var xml:XML = 
    <root>
        <member id="1">
            <name>akifumi</name>
            <job>engineer</job>
        </member>
        <member id="2">
            <name>tarou</name>
            <job>analyst</job>
        </member>
    </root>;

// ノードの値でフィルタリング
trace(xml.member.(name == "akifumi")); // 一つめの<member>ノードを取得

// 属性値でフィルタリング
trace(xml.member.(@id == 2)); // 二つめの<member>ノードを取得
trace(xml.member.(@id <= 1)); //不等号を使うことも可能。この場合は、一つめの<member>ノードを取得

// 正規表現によるマッチングを利用することもできます。
var regexp:RegExp = new RegExp("engineer");
trace(xml.member.(job.toString().match(regexp) != null)); //一つめの<job>ノードを取得


名前空間が指定されている値の取得
Namespaceクラスを利用することで、名前空間が指定されているXMLの値を取得することが可能です。
//例
var xml:XML =
aaaa
bbbb
;

// namespaceを指定して値を取得
var ns:Namespace = new namespace("http://hogehoge.hoge");
trace(xml.name); // aaaa
trace(xml.ns::name); // bbbb
<
default xml namespace ディレクティブを利用することで、デフォルトのnamespaceを指定することもできます。



var xml:XML = <root xmlns:hoge="http://hogehoge.hoge" xmlns:fuga="http://fugafuga.fuga">
	<fuga:name>aaaa</fuga:name>
	<hoge:name>bbbb</hoge:name>
</root>;

// デフォルトnamespaceを設定
var ns1:Namespace = new Namespace("http://hogehoge.hoge");
default xml namespace = ns1;

trace(xml.name); // bbbb

// デフォルトnamespaceを切り替え
var ns2:Namespace = new Namespace("http://fugafuga.fuga");
default xml namespace = ns2;

trace(xml.name); // aaaa


以上、前回と今回の2回に渡って、簡単ですがAS3におけるE4Xの使い方をまとめてみました。
特に、フィルタリングの部分はうまく使うことで、非常に簡単に目的の値を取得することが可能になるかと思いますので、尻込みせずに、ぜひ使ってみていただけたらと思います。

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"
}


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