【问题标题】:XML HTTPService Result and for eachXML HTTPService 结果和每个
【发布时间】:2010-03-03 18:35:46
【问题描述】:

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 的 C++ 专家比 flex 多得多,但是……)

完美的事情是 HTTPrequest 以一致的方式处理每个标签(使用 always 数组......虽然我猜这也有它的缺点)。

谢谢!

【问题讨论】:

    标签: xml apache-flex object foreach httpservice


    【解决方案1】:

    我认为这个问题实际上是一个错误,您可以在 HTTPService 结果处理程序中处理并强制您返回的对象成为数组集合。这是我的应用程序中的一个 sn-p。

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

    【讨论】:

    • 好吧,我最终得到了一个类似的解决方案,但我更喜欢你的代码 sn-p。 :D
    【解决方案2】:

    这是我目前的解决方案:

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

    【讨论】:

      【解决方案3】:

      听起来您的 &lt;specifictag&gt; 元素是顶级的,而不是在其他根目录中?一个 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());
          }
      }
      

      【讨论】:

      • 不,它们位于 XML 的根...我将尝试放在根标记下,看看它们是否被视为 ArrayCollection。谢谢!
      • 它也不起作用,不管它们放在哪里。
      猜你喜欢
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多