【问题标题】:Can't Access XML variable in PHP from Flash?无法从 Flash 访问 PHP 中的 XML 变量?
【发布时间】:2015-11-05 10:30:00
【问题描述】:

我将一些信息从 PHP 发送到 flash,并将一些不同的信息从 PHP 发送回 flash。我正在向 PHP 发送一个用户 ID,并将一个 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 中删除索引变量并且只将“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 header设置成xml吗? header( "content-type: application/xml; charset=ISO-8859-15" );
  • 刚试过这个,还有header("content-type: text/xml"),都产生了和之前一样的错误:(
  • 你能显示 php 操作的实际输出吗?您可能会得到这样的东西:&lt;xml&gt;&lt;/xml&gt;3,它不是有效的 xml,并且没有 xml url 参数,因为 AS3 期待这样的东西:xml=&lt;xml&gt;&lt;/xml&gt;&amp;index=3
  • 除了 ReferenceError 之外,php 操作在 Flash 中没有输出。当我使用event.currentTarget.data,并且xml 是唯一被回显的东西时,xml 被输出并在闪存中格式化。
  • @BadFeelingAboutThis: &lt;?xml version="1.0"?&gt; &lt;presets&gt; &lt;colors&gt;0xff0000&lt;/colors&gt; &lt;colors&gt;0x00ff00&lt;/colors&gt; &lt;colors&gt;0x0000ff&lt;/colors&gt; &lt;/presets&gt; 3' is what is outputted when I use .TEXT. When I create a new set of URLVariables inside my onComplete function, and access the .xml` 新 URLVariables 的属性,我得到 null 作为我的输出。 (对不起,我评论中的xml在输出中格式正确)

标签: php xml actionscript-3 flash


【解决方案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.xmlevent.currentTarget.data.index,那么您需要执行以下操作:

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

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

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

    &lt;xml&gt;&lt;/xml&gt; 替换为您的完整 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);

【讨论】:

  • 所以我可能误解了闪存中loader.data 的用法。如果我有两个变量要从 PHP 发送到 Flash,一个是 XML 对象 (xml),另一个是整数(索引),我不能通过 Flash 分别访问这些元素吗? (即event.currentTarget.data.xmlevent.currentTarget.data.index)。我是否仅限于整体访问loader.data
  • 谢谢。我记得现在看到这样的事情。我会以类似于echo "$xml=$xml-&gt;saveXML()"; 的方式从 PHP 中回显这个吗?
  • 是的,然后在任何后续参数之间使用与号。我已经有大约十年没有真正使用过 PHP 了,所以我已经很生疏了。
  • 非常感谢。它仍然无法正常工作,但我认为这是朝着正确方向迈出的一步,我希望能找出从这里出发的地方。
  • 它适用于我的字符串:xml=&lt;?xml version="1.0"?&gt;&lt;presets&gt;&lt;colors&gt;0xff0000&lt;/colors&gt;&lt;colors&gt;0x00ff00&lt;/colors&gt;&lt;colors&gt;0x0000ff&lt;/colors&gt;&lt;/presets&gt;&amp;index=3。不幸的是,我无法在 PHP 方面提供太多帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2012-05-04
  • 2016-11-12
相关资源
最近更新 更多