XML HTTPService结果和每个

时间:2010-03-03 18:35:47

标签: xml flex object foreach httpservice

XML在flex方面很酷,但我有一个烦人的问题要解决,因为我能想象的是一个功能。你看,当你只有一个东西的标签时,它会创建一个不是数组的对象。但是当找到多个时,它会将它放在数组结构上。

我想优雅地解决它。任何建议。

示例:这说明了它是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以一致的方式处理每个标签(总是使用数组......虽然我猜这也有它的缺点)。

谢谢!

3 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:0)

这是我目前的解决方案:

// historial
var hist:ArrayCollection = new ArrayCollection();
if(resObj.hist[0])
  hist = resObj.hist;
else
  hist.addItem(resObj.hist);

答案 2 :(得分:0)

听起来你的<specifictag>元素是顶层而不是其他根目录? XML文档只能有一个根,因此在这种情况下,您实际上在某些情况下会获得XML文档,而在其他情况下会获得ArrayCollection个XML文档。如果您将服务更改为始终返回单个XML容器,该容器的子容为specifictag,则不必担心此问题。

以下代码演示了迭代一个元素与处理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());
    }
}