【问题标题】:Flex/ActionScript, PHP, and XML ErrorFlex/ActionScript、PHP 和 XML 错误
【发布时间】:2013-05-31 22:12:37
【问题描述】:

我有一些使用 Flex/ActionScript 读取的 XML。当我加载 XML 时,Flash Builder 给我一个错误,上面写着 Error: Unknown Property: 'EventTitle'. at mx.collections::ListCollectionView/http://www.adobe.com/2006/actionscript/flash/proxy::getProperty()[E:\dev\4.y\frameworks\projects\framework\src\mx\collections\ListCollectionView.as:870]. 我引用“EventTitle”的唯一位置是我将其加载到列表中的位置下方。

当我从 XML 中删除 <Invite> 部分时,它可以正常加载。但是一旦我再次添加它,它就会给我错误。下面是 XML 的结构:

 <Invites>
      <Invite>
        <EventTitle>HelloWorld</EventTitle>
      </Invite>
      <Invite>
        <EventTitle>HelloWorld2</EventTitle>
      </Invite>
    </Invites>

我正在使用 PHP 创建 XML:

if ($_POST['method'] == "GET_INVITES") {
    $sql = mysql_connect("localhost:8889", "---------------", "--------------");
    if(!$sql) {
        die('Could not connect:' . mysql_error());
    }   

    mysql_select_db("Calendar", $sql);
    $getInvitesQuery = mysql_query("SELECT * FROM `Invites` WHERE `To`='" . $_POST['userID'] . "'");

    $result = "<Invites>";
    $result .= "<Result>SUCCESS</Result>";
    while($row = mysql_fetch_array($getInvitesQuery)){
        $result .= "<Invite>";
        $result .= "<FromID>" . $row['From'] . "</FromID>";
        $result .= "<EventTitle>" . $row['Title'] . "</EventTitle>";
        $result .= "<EventDay>" . $row['Day'] . "</EventDay>";
        $result .= "<EventHour>" . $row['Hour'] . "</EventHour>";
        $result .= "<EventMinute>" . $row['Minute'] . "</EventMinute>";
        $result .= "</Invite>";
    }
    $result .= "</Invites>";    
    print($result); 
}

我在 Flex/ActionScript 中使用 HTTPService 将 XML 从 PHP 文件加载到列表中。这是代码:

<s:HTTPService id="getInvites" result="getInvitesResult(event)" method="POST" url="http://localhost/invite.php" useProxy="false">
            <s:request xmlns="">
                <method>GET_INVITES</method>
                <userID>{my_id.text}</userID>
            </s:request>
        </s:HTTPService>

<s:List id="invites" x="5" y="295" width="310" change="rowSelected(event)">
        <s:dataProvider>
            <s:ArrayCollection source="{getInvites.lastResult.Invites.Invite.EventTitle}"/>
        </s:dataProvider>
    </s:List>

我已经工作了 2-3 个小时并试图找出解决方案。非常感谢任何帮助。

谢谢, 雅各布

【问题讨论】:

  • 您已经分享了您的错误,这很好。而且你分享了很多很好的代码。但是,您可能会考虑尝试告诉我们是哪段代码引发了错误。什么时候抛出错误?

标签: php xml actionscript-3 apache-flex


【解决方案1】:

我觉得这里有几个问题:

不要在 e4x 表达式中包含 XML 对象的根标记

使用 e4x 表达式时,不应包含 XML 的根标记。所以尝试改变这一行:

<s:ArrayCollection source="{getInvites.lastResult.Invites.Invite.EventTitle}"/>

收件人:

<s:ArrayCollection source="{getInvites.lastResult.Invite.EventTitle}"/>

作为替代方案,您可以向 XML 添加另一个根标记,以便您的原始表达式有效:

<root>
    <Invites>
       ...
    </Inivtes>
</root>

为列表提供适当的数据提供者

e4x 表达式“Invite.EventTitle”(在您的 XML 上使用时)将返回一个 XMLList 对象。这不适合用作列表的 dataProvider。列表的dataProvider 属性需要实现IList 接口的东西。幸运的是,您需要做的就是创建一个XMLListCollection 对象。您将需要重构您的代码,以便可以创建此 XMLListCollection

一种方法是将resultfault 处理程序添加到您的HTTPService。这实际上比使用lastResult 属性要好。原因是当您的应用多次调用服务时,使用lastResult 可能不会引用正确的结果。

result 事件处理程序中,您可以创建新的XMLListCollection 并将其设置在列表中:

<s:HTTPService id="getInvites" result="handleResult(event)" fault="handleFault(event)" resultFormat="e4x" ... />

private function handleResult(event:ResultEvent):void
{
    var xml:XML = event.result as XML;
    var xmlList:XMLList = xml.Invite.EventTitle; // an XML "array" of event titles
    var xmlCollection:XMLListCollection = new XMLListCollection(xmlList);
    // now set xmlCollection as the dataProvider for the list
    invites.dataProvider = xmlCollection;
}

请注意,在上面我还将HTTPServiceresultFormat 指定为“e4x”。

以上是从内存中编码的,所以这里或那里可能有错误;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 2014-11-17
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多