2

どちらもオブジェクトを直接拡張するため、XML 広告 XMLList を無関係にすることは、AS3 コア ライブラリの設計上の欠陥であると思わざるを得ません。XML を XMLList に拡張すると、XML が 1 つのメンバーのみを持つ XMLList と見なされる場合に、よりクリーンなシステムになるのではないでしょうか?

これにより、E4X クエリが XML または XMLList のいずれかを返す可能性があり、キャスト エラーが発生する可能性があるという非常に煩わしい慣行も回避できます。

では、XML と XMLList が共通の型として Object のみを持つように設計されていると考えていない理由はありますか?

4

4 に答える 4

2

E4X (p22)のECMA仕様とXMLListドキュメントによると、XMLListクラスにはXMLクラスのメソッドが含まれているようですが、メンバーが1つしかない場合に限ります。したがって、E4Xクエリを実行する場合、結果は常にXMLList型の変数に格納する必要があります。

以前は、これらのオブジェクトの名前から、XMLオブジェクトはXML要素データの複雑なツリーを表していると思いましたが、仕様(p12)によると、これは正しくありません。「XMLタイプの各値はXML要素を表します。属性、コメント、処理命令またはテキストノード」。

2つのより一般的な型として使用する必要があるのはXMLListクラスです。「XMLList型の値は、XMLドキュメント、XMLフラグメント、またはXMLオブジェクトの任意のコレクション(クエリ結果など)を表します」

E4XクエリをXML型の変数として保存するべきではなかったので、これでキャストの問題が解決します。XMLクラスは、XMLListを反復処理し、XML要素を分解するためにのみ使用する必要があります。

于 2009-03-08T08:16:43.223 に答える
0

ActionScript 3.0では、XMLListはxmlを処理する新しい方法ですが、XMLクラスはAS 2であるため、下位互換性を提供するために含まれていました。

新しいコードを作成する場合は、ここでXMLListを使用する必要があります。

お役に立てれば

ジョン

于 2009-06-22T14:59:51.420 に答える
0

お気付きのように、自動的に変更される XML および XMLList 型は非常に混乱する可能性があります。このようなことは、賢いプログラマー (ここで Adob​​e を指しています..) が物事の周りに便利なラッパーを作成するときに発生します。

何が起こっているかというと、一種の「自動型変換」です。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]);
于 2009-05-20T22:58:02.330 に答える
0

したがって、この質問に対する私の簡潔な答えは、継承ツリーを見ると、はい、2 つのクラス ( XMLListXML ) は無関係であるということです。

しかし、ECMA スクリプト/AS3 のドキュメントを見ると、それらは関連しており、おそらく ECMA スクリプト/AS3 のプロトタイプ システムを使用しています。

XMLListにメンバーが 1 つしかない場合、XML ノードのように扱うことができます。XML クラスのメソッドとフィールドは、AVM2 によって XMLList プロトタイプに挿入されていると思います。

于 2009-03-11T09:08:12.140 に答える