SSブログ
Lancers.jp

AS3のXML操作 [ActionScript]

ActionScript3でのXML操作でハマったので、メモ。

ある特定の要素を拾いたい時に、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の頃の知識が邪魔することも多々あって、非常に混乱しがち。
もうちょっとスマートに移行して欲しかったなぁ。もしくは、もっと別物にして欲しかった。


nice!(1)  コメント(2)  トラックバック(0) 

nice! 1

コメント 2

Yaga

はじめてFlexいじっています。XMLのパースで悩んでいました。
まさか名前空間の指定がいるとは。
ここで半日つまづいていました。助かりました~。
by Yaga (2009-03-21 05:02) 

sandman

> yagaさん
これ、本当にハマりますよね!
自分も半日以上悩みましたよ。お役に立てて良かったです。

良いFlexライフを!
by sandman (2009-03-21 18:33) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。