0

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

谢谢!

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 文档只能有一个根,因此在这种情况下,您实际上在某些情况下得到一个 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());
    }
}
于 2010-03-03T18:49:16.133 回答