0

XMLはフレックスでかっこいいですが、私が想像できる機能が原因で、解決するのが面倒な問題があります。ご覧のとおり、タグが1つしかない場合は、配列ではないオブジェクトが作成されます。ただし、複数が見つかった場合は、配列構造に配置されます。

エレガントに解決したいです。任意の推奨事項。

例:これは、HTTPリクエストの結果であるということを示しています。

private function initXMLRes(event:ResultEvent):void
{
    var resObj:Object = event.result;
    //
    for each(var i:Object in resObj.specifictag)
    {
        // to use specifictag attributes, etc. example:
        Alert.show(specifictag.name);
    }
}

前のコードは2つ以上のアイテムで機能します。このxmlを受け入れます:

<specifictag name="one" /><specifictag name="two" />

...しかしこれではありません:

<specifictag name="one" />

resObj.specifictagの形式をチェックして(配列があるかどうかをチェックするため)、コードを複製することができます(それぞれの場合)。しかし、関数を呼び出しているとしても、それがエレガントなソリューションだとは思いません。

さて、誰かがこの問題について良い考えを持っていることを願っています。(経験から、SOにはflexよりもはるかに多くのC ++エキスパートがいることを知っていますが、まあ...)

完璧なのは、HTTPrequestがすべてのタグを一貫した方法で処理することです(常に配列を使用します...これにも欠点があると思いますが)。

ありがとう!

4

3 に答える 3

2

私が思う問題は実際にはバグであり、HTTPService結果ハンドラーで処理して、返されたオブジェクトを強制的に配列コレクションにすることができます。これが私のアプリのスニペットです。

if (evt.result.rows.row is ArrayCollection) {
    MyAC= evt.result.rows.row;
}else{
    MyAC= new ArrayCollection(ArrayUtil.toArray(evt.result.rows.row));
}

したがって、次のように機能するはずです。

var resObj:Object = new Object();

if (event.result.rows.row is ArrayCollection) {
    resObj= event.result
}else{
    resObj= new ArrayCollection(ArrayUtil.toArray(event.result));
}
于 2010-03-03T18:44:14.337 に答える
0

これが私の現在の解決策です:

// historial
var hist:ArrayCollection = new ArrayCollection();
if(resObj.hist[0])
  hist = resObj.hist;
else
  hist.addItem(resObj.hist);
于 2010-03-03T18:48:46.737 に答える
0

あなたの<specifictag>要素はトップレベルであり、他のルートの中にはないように聞こえますか?XMLドキュメントはルートを1つしか持つことができないため、この場合、実際にXMLドキュメントを取得する場合と、XMLドキュメントを取得する場合がありますArrayCollection。サービスを変更して、子として持つ単一のXMLコンテナーを常に返すようspecifictagにすると、この問題について心配する必要はありません。

次のコードは、1つの要素を反復処理することは、XMLオブジェクトを処理するときに複数の要素を反復処理することと同じように機能することを示しています。

private function init():void {
    trace("Iterating two children");
    iterate(<root><child /><child /></root>);
    trace("Iterating one child:");
    iterate(<root><child /></root>);
}

private function iterate(x:XML):void {

    for each(var element:XML in x.child) {
        trace(element.name());
    }
}
于 2010-03-03T18:49:16.133 に答える