无法从Flash访问PHP中的XML变量吗?

时间:2015-08-12 17:16:53

标签: php xml actionscript-3 flash

我正在从PHP向flash发送一些信息,并将一些不同的信息从PHP发送回flash。我将用户ID发送给PHP,并将XML变量和索引发送回Flash。

Flash代码:

var myLoader:URLLoader = new URLLoader();
  var myRequest:URLRequest = new URLRequest(/*private info*/);
  myRequest.method = URLRequestMethod.POST;
  var memberInfo:URLVariables = new URLVariables();
  memberInfo.member_id = 1817;
  myRequest.data = memberInfo;
  myLoader.addEventListener(Event.COMPLETE, onXMLLoad);
  myLoader.load(myRequest);

  function onXMLLoad(event:Event)
  {
    var newXML:XML = new XML(event.currentTarget.data.xml);
    var index:int = new int(event.currentTarget.data.index);
  }

PHP:

$xml = new DOMDocument("1.0");
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$presets = $xml->createElement("presets");
$red = $xml->createElement("colors", "0xff0000");
$green = $xml->createElement("colors", "0x00ff00");
$blue = $xml->createElement("colors", "0x0000ff");

$presets->appendChild($red);
$presets->appendChild($green);
$presets->appendChild($blue);
$xml->appendChild($presets);

$index = 3;

echo $xml->saveXML();
echo $index;

当我这样做时,我收到此错误:

ReferenceError: Error #1069: Property xml not found on String and there is no default value.

我该如何解决这个问题?我认为它与XML实际上是一个字符串有关,但我不太确定。

以下是PHP的输出:

<?xml version="1.0"?>
<presets>
    <colors>0xff0000</colors>
    <colors>0x00ff00</colors>
    <colors>0x0000ff</colors>
</presets> 3

注意: 如果我从PHP中删除索引变量,只需要&#34; xml&#34;作为唯一被发送到Flash的东西,我可以使用&#34; event.currentTarget.data&#34;来访问它。它会正常工作。

闪光:

var myLoader:URLLoader = new URLLoader();
  var myRequest:URLRequest = new URLRequest(/*private info*/);
  myRequest.method = URLRequestMethod.POST;
  var memberInfo:URLVariables = new URLVariables();
  memberInfo.member_id = 1817;
  myRequest.data = memberInfo;
  myLoader.addEventListener(Event.COMPLETE, onXMLLoad);
  myLoader.load(myRequest);

  function onXMLLoad(event:Event)
  {
    var newXML:XML = new XML(event.currentTarget.data);
  }

PHP:

$xml = new DOMDocument("1.0");
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;
$presets = $xml->createElement("presets");
$red = $xml->createElement("colors", "0xff0000");
$green = $xml->createElement("colors", "0x00ff00");
$blue = $xml->createElement("colors", "0x0000ff");

$presets->appendChild($red);
$presets->appendChild($green);
$presets->appendChild($blue);
$xml->appendChild($presets);
echo $xml->saveXML();

1 个答案:

答案 0 :(得分:1)

问题在于PHP的输出。

显示的输出无效xml(因为最后的3)。

这就是删除索引时它的工作原理。

要纠正它,要么将索引放在xml中(或许作为根presets节点的属性),要么在将输出转换为AS3中的XML对象之前解析输出,如下所示:

        var response:String = event.currentTarget.data;
        var index:String = response.substr(response.lastIndexOf(">") + 1);
        var newXML:XML = new XML(response.substring(0, response.lastIndexOf(">") + 1));

如果您希望能够将变量作为数据属性上的对象进行访问(例如event.currentTarget.data.xml&amp; event.currentTarget.data.index,那么您需要执行以下操作:

  1. 将URLLoader的dataFormat属性设置为URLLoaderDataFormat.VARIABLES,以便它知道如何解析响应。

  2. 从PHP发送一个url变量格式的字符串。因此,您对php的响应需要如下所示:

    xml=<xml></xml>&index=3
    

    用完整的xml替换<xml></xml>。请注意,所有数据都需要遵循url变量格式规则,因此您可能需要在值上使用escape(或PHP中为rawurlencode)和unescape(在AS3中)

    这就是我认为php应该是这样的:

    echo "xml=".$xml->saveXML(); 
    echo "&index=".$index;
    
  3. 更容易,可能只是使用JSON并在PHP中创建一个对象并执行echo json_encode(obj),然后在flash中执行var response:Object = JSON.parse(event.currentTarget.data);