お気付きのように、自動的に変更される XML および XMLList 型は非常に混乱する可能性があります。このようなことは、賢いプログラマー (ここで Adobe を指しています..) が物事の周りに便利なラッパーを作成するときに発生します。
何が起こっているかというと、一種の「自動型変換」です。XML 型にとどまりません。次の XML の例を考えてみましょう。
<myXml>
<sound id="0">Boogaloo</sound>
<sound id="1">Bond theme</sound>
<sound id="2">2001</sound>
</myXml>
という変数に上記の XML があるとしますmyXml
。次の例では、E4X は 1 つのアイテムを含む XMLList を返し、 を使用して最初の XML アイテムにアクセスします[0]
。
trace(myXml.sound.(@id == 0)[0] == <sound id="0">Boogaloo</sound>);
// traces true
この例では[0]
、Flash の自動型変換に依存して、この部分を省略しています。返された 1 つのアイテムが XML に変換されます。
trace(myXml.sound.(@id == 0) == <sound id="0">Boogaloo</sound>);
// traces true
ただし、一致したこの 1 つの XML ノードに単純なテキスト ノードが含まれている場合、Flash はその型をさらに String に自動的に変換します。
trace(myXml.sound.(@id == 0) == "Boogaloo");
// traces true
そして、テキスト ノードが数値として解釈できる場合 (ID が 2 の XML ノード)、Flash はそれをさらに数値に変換します。
trace(myXml.sound.(@id == 2) == 2001);
// traces true
ウット!
それで、これについて何をすべきか?
お気づきのように、型と「便利な」XML 処理には十分注意する必要があります。推奨される方法の 1 つは、単一の結果が必要であることがわかっている場合は、常に配列アクセス演算子を使用して E4X 結果の最初の XML 項目を指すことです。
config.users.admin[0].settings[0].email.(@type == "work")[0];
最初は奇妙に見え、コードに冗長性が追加されますが、利点は、1 つの要素、1 つの要素、およびtype の1 つの 要素を探していることを明示的に示していることです。そして、あなたはそれの外観に慣れます。admin
settings
email
"work"
もう 1 つのヒントは、使用する予定の型にキャストすることを常に忘れないことです。いくつかの例:
allUsers = XMLList(config.users);
adminSettings = XML(config.users.admin[0].settings[0]);
adminWorkEmail = String(config.users.admin[0].settings[0].email.(@type == "work")[0]);
adminBirthYear = int(config.users.admin[0].birthdate[0].@year[0]);