【问题标题】:Flex: Processing xml, before using it in datagridFlex:在数据网格中使用之前处理 xml
【发布时间】:2009-08-12 14:42:40
【问题描述】:

我有以下问题:

我的 web 服务应用程序按以下顺序返回 xml 数据:

<my_claims>
  <claim>
    <opponent>Oleg</opponent>
    <rank>2000</rank>
  </claim>
</my_claims>

其中声明节点的数量,可以是0,1,以此类推。

我如何正确处理从服务接收到的数据。目前,当我尝试将索赔数据存储为数组集合时,例如

this.Claims = event.result.my_claims.claim;

public function set Claims(array:ArrayCollection):void
{
    this.claims = array;
}

我收到错误:

TypeError:错误 #1034:类型强制 失败:无法转换 mx.utils::ObjectProxy@1f94ca19 到 mx.collections.ArrayCollection.

据我了解,Flex 将其作为 XmlObject 处理,但在我从服务列表中获得多个项目后,一切正常:

(带有多个声明的示例) 奥列格 2000 测试 2000

【问题讨论】:

    标签: apache-flex actionscript-3 httpservice


    【解决方案1】:

    改为使用 xmllist 集合。 this.Claims = new XMLListCollection(event.result.my_claims.claim); 您需要更新您的 Claims 函数以匹配

    【讨论】:

    • 正在尝试这个建议:所以添加了:import mx.collections.XMLListCollection; [可绑定] public var 声明:XMLListCollection;声明 = 新 XMLListCollection(event.result.my_claims.claim);到代码,但它抛出异常 TypeError: Error #1034: Type Coercion failed: cannot convert mx.utils::ObjectProxy@35ca2701 to XMLList。在 goclient::ListOfPlayers/resultHandler()[/Users/oleg/Documents/FB/usersList/src/goclient/ListOfPlayers.as:59] 在 flash.events::EventDispatcher/dispatchEventFunction() 在 flash.events::EventDispatcher/ dispatchEvent() 你能帮忙吗?
    • 哦,我的错...您需要将数据加载为 e4x 而不是对象。你在使用 HTTP 服务吗? .
    • 感谢您的回答。现在我得到这个错误:[RPC Fault faultString="Error #1088: The markup in the document after the root element must be well-formed." faultCode="Client.CouldNotDecode" faultDetail="null"] 这是我创建服务的方式: usersListService = new HTTPService(); usersListService.url = "127.0.0.1:8000/go/active"; usersListService.resultFormat = "e4x";也许是我从服务器发送的 XML 数据?
    • xml version="1.0" ?> test1 127.0.0.1:8000/site_media/images/js_jpg_150x150_q85.jpg</img> 2000Oleg对手> 2000testFFalse播放器>
    • 每个 XML 文档都需要有一个围绕所有内容的根标记。您的文档以 开头并以 结尾。它们需要是相同的标签
    【解决方案2】:

    尝试像这样设置你的数组集合:

    if( event.result.my_claims.claim is ArrayCollection ){
      this.claims = event.result.my_claims.claim as ArrayCollection;
    
    }
    else{
      this.claims = new ArrayCollection( [event.result.my_claims.claim] );
    }
    

    如果结果只有 1 项,则会出现此错误

    【讨论】:

    • 我刚刚尝试了这个解决方案。一切似乎都正常,并且声明变量填充了来自 XML 服务的列表。但似乎我不能将它用作数据网格的数据提供者,以防列表中只有一项......?
    【解决方案3】:

    我自己以前也遇到过。 Adobe 在Traversing XML structures 上的文档并没有完全明确这一点。

    他们的文档指出,如果有多个具有特定名称的元素,则必须使用数组索引表示法来访问它:

    var testXML:XML = <base>
        <book>foo</book>
        <book>bar</book>
    </base>
    
    var firstBook:XML = testXML.book[0];
    

    然后继续说,如果只有一个具有特定名称的元素,那么您可以省略数组索引表示法:

    var testXML:XML = <base>
        <book>foo</book>
    </base>
    
    var firstBook:XML = testXML.book;
    

    这意味着当您尝试强制强制转换为 Array 类型时,它不起作用,因为它将单个元素视为 XMLNode 而不是 XMLList。

    如果幸运的话,您可以检查&lt;my_claims&gt; 节点上的子节点数量,然后决定是否要扭曲ArrayCollection 中的单个元素,或者是否可以使用自动强制转换来处理多个元素。

    【讨论】:

      猜你喜欢
      • 2012-07-09
      • 2010-12-24
      • 2013-03-25
      • 2011-01-16
      • 2023-01-31
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多