AS3のXML操作 [ActionScript]
ActionScript3でのXML操作でハマったので、メモ。
ある特定の要素を拾いたい時に、XML.element(name)を使うんだけど、これがちょっとクセモノ。
というのは、マニュアルに書いてある通りにしても、できない場合がある。
マニュアルには、
と書いてあり、この場合は確かに問題無い。
しかし、問題は名前空間が指定してあった場合のときに、これだと目的の要素が取得できない。
こんな感じ
これを解決するには、XML.element()に要素名だけでなく、QNameオブジェクトを与えなければならない。
AS3になって、便利な部分も増えたけど、AS2の頃の知識が邪魔することも多々あって、非常に混乱しがち。
もうちょっとスマートに移行して欲しかったなぁ。もしくは、もっと別物にして欲しかった。
ある特定の要素を拾いたい時に、XML.element(name)を使うんだけど、これがちょっとクセモノ。
というのは、マニュアルに書いてある通りにしても、できない場合がある。
マニュアルには、
var xml:XML =
<foo>
<!-- comment -->
<?instruction ?>
text
<a>1</a>
<b>2</b>
</foo>;
trace(xml.elements("*").length()); // 2
trace(xml.elements("*")[0].toXMLString()); // <a>1</a>
trace(xml.elements("b").length()); // 1
trace(xml.elements("b")[0].toXMLString()); // <b>2</b>
と書いてあり、この場合は確かに問題無い。
しかし、問題は名前空間が指定してあった場合のときに、これだと目的の要素が取得できない。
こんな感じ
var xml:XML =
<foo xmlns="http://baa.com/">
<!-- comment -->
<?instruction ?>
text
<a>1</a>
<b>2</b>
</foo>;
trace(xml.elements("*").length()); // 2
trace(xml.elements("*")[0].toXMLString()); // <a xmlns="http://baa.com/">1</a>
trace(xml.elements("b").length()); // 0
trace(xml.elements("b")[0].toXMLString()); // エラー
これを解決するには、XML.element()に要素名だけでなく、QNameオブジェクトを与えなければならない。
var xml:XML =
<foo xmlns="http://baa.com/">
<!-- comment -->
<?instruction ?>
text
<a>1</a>
<b>2</b>
</foo>;
trace(xml.elements("*").length()); // 2
trace(xml.elements("*")[0].toXMLString()); // <a xmlns="http://baa.com/">1</a>
var ns:Namespace = new Namespace('http://baa.com/');
var q:QName = new QName(ns, 'b')
trace(xml.elements(q).length()); // 1
trace(xml.elements(q)[0].toXMLString()); // <b xmlns="http://baa.com/">2</b>
AS3になって、便利な部分も増えたけど、AS2の頃の知識が邪魔することも多々あって、非常に混乱しがち。
もうちょっとスマートに移行して欲しかったなぁ。もしくは、もっと別物にして欲しかった。
2009-02-05 23:12
nice!(1)
コメント(2)
トラックバック(0)
はじめてFlexいじっています。XMLのパースで悩んでいました。
まさか名前空間の指定がいるとは。
ここで半日つまづいていました。助かりました~。
by Yaga (2009-03-21 05:02)
> yagaさん
これ、本当にハマりますよね!
自分も半日以上悩みましたよ。お役に立てて良かったです。
良いFlexライフを!
by sandman (2009-03-21 18:33)