XML HTTPService结果和每个

XML HTTPService结果和每个,xml,apache-flex,object,foreach,httpservice,Xml,Apache Flex,Object,Foreach,Httpservice,XML在flex中很酷,但我有一个恼人的问题要解决,这是由我可以想象的一个特性引起的。你看,当你只有一个标记时,它会创建一个不是数组的对象。但当找到多个时,它会将其放在一个数组结构上 我想优雅地解决它。任何建议 示例:这说明了HTTP请求的结果: private function initXMLRes(event:ResultEvent):void { var resObj:Object = event.result; // for each(var i:Object i

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的格式(检查它是否有数组),然后复制代码(针对每种情况)。但是,即使是调用函数,我也不认为这是一个优雅的解决方案

嗯,我希望有人对这件事有个好主意。(我从经验中知道,所以有很多C++专家比Flex,但是……)

完美的做法是HTTPrequest以一致的方式处理每个标记(使用always数组…尽管我猜这也有其缺点)


谢谢

我认为问题实际上是一个bug,您可以在HTTPService结果处理程序中处理该bug,并强制将返回的对象转换为数组集合。以下是我的应用程序中的一个片段

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));
}

这是我当前的解决方案:

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

听起来您的
元素是顶级的,而不是在其他根目录中?一个XML文档只能有一个根,因此在本例中,在某些情况下实际上会得到一个XML文档,在其他情况下会得到一个XML文档的
ArrayCollection
。如果将服务更改为始终返回一个包含
specifictag
的XML容器作为其子容器,则不必担心此问题

下面的代码演示了在处理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());
    }
}
private function init():void{
跟踪(“迭代两个子项”);
迭代();
跟踪(“迭代一个子项:”;
迭代();
}
私有函数迭代(x:XML):void{
对于每个(var元素:x.child中的XML){
跟踪(element.name());
}
}

我最终得到了类似的解决方案,但我更喜欢您的代码片段:DNo,它们位于XML的根。。。我将尝试将它们放在根标记下,看看它们是否被视为ArrayCollection。谢谢!这也不起作用,不管他们在哪里。