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

Can't Access XML variable in PHP from Flash?

我正在将一些信息从 PHP 发送到闪存,并将一些不同的信息从 PHP 发送回闪存。我将一个用户 ID 发送到 PHP,并将一个 XML 变量和一个索引发送回 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 中删除索引变量并且只将 "xml" 作为发送到 Flash 的唯一内容,我可以使用 "event.currentTarget.data" 访问它并且它会正常工作。

快闪:

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

问题出在 PHP 的输出上。

显示的输出无效 xml(因为末尾有 3)。

这就是当您删除索引时它起作用的原因。

要纠正它,要么将索引放在 xml 中(可能作为根 presets 节点的属性),要么在将其转换为 [=63= 之前解析输出] AS3 中的对象,像这样:

        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 & 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;
    

虽然更简单,可能只使用 JSON 并在 PHP 中创建一个对象并执行 echo json_encode(obj),然后在 flash 中执行 var response:Object = JSON.parse(event.currentTarget.data);