我有两个 XML 文件,
这是从 Web 服务调用输出到 LMS (Moodle) http://clsasset.coastlinelive.com/LTI/XMLFile.xml的复制/粘贴:
<?xml version="1.0" encoding="UTF-8"?>
<imsx_POXEnvelopeResponse xmlns="http://www.imsglobal.org/lis/oms1p0/pox">
<imsx_POXHeader>
<imsx_POXResponseHeaderInfo>
<imsx_version>V1.0</imsx_version>
<imsx_messageIdentifier>524041811</imsx_messageIdentifier>
<imsx_statusInfo>
<imsx_codeMajor>success</imsx_codeMajor>
<imsx_severity>status</imsx_severity>
<imsx_description>Grade replace response</imsx_description>
<imsx_messageRefIdentifier>526f30b728966</imsx_messageRefIdentifier>
</imsx_statusInfo>
</imsx_POXResponseHeaderInfo>
</imsx_POXHeader>
<imsx_POXBody>
<replaceResultResponse/>
</imsx_POXBody>
</imsx_POXEnvelopeResponse>
这是我在网上随机找到的一个示例 XML,然后将一些元素重命名为与第一个相同的元素 http://clsasset.coastlinelive.com/LTI/XMLFile2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<imsx_codeMajor id="bk101">
<author>Gambardella, Matthew</author>
<title>XML Developer's Guide</title>
<genre>Computer</genre>
<price>44.95</price>
<publish_date>2000-10-01</publish_date>
<description>
An in-depth look at creating applications
with XML.
</description>
</imsx_codeMajor>
<imsx_codeMajor id="bk102">
...
</imsx_codeMajor>
...
</catalog>
这是我用来读取这些文件的 AS3 代码:
var commandURL:String = "http://clsasset.coastlinelive.com/apps/LTI/XMLFile.xml?time=" + Math.random();
//Load XML
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.load(new URLRequest(commandURL));
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded, false, 0, true);
var xmlData:XML;
function xmlLoaded(e:Event):void
{
var xmlLoader:URLLoader = (e.target as URLLoader);
xmlLoader.removeEventListener(Event.COMPLETE, xmlLoaded);
xmlData = XML(xmlLoader.data);
trace("LTI Provider Full Data" + xmlData);
var statusXML:XMLList = xmlData.child(0);
trace("LTI Provider Result Data" + xmlData..imsx_codeMajor);
}
出于某种原因,加载 XMLFile.xml 时,“xmlData..imsx_codeMajor”(或 .. 任何元素)总是返回空。但是,如果我加载 XMLFile2.xml 它会返回一个不错的 XMLList 对象。
为了好玩,我将整个 XMLFile.xml 重新输入到 XMLFile3.xml,它也可以很好地加载和解析。
这让我认为这是一个编码问题。问题是 XML 数据是通过 PHP 使用从 Web 服务接收数据的变量打印的,我无法控制该变量。
吐出 XML 的 PHP 脚本是 LTI 示例代码库的衍生版本,PHP 文件的基本部分是:
header ('Content-Type: text/xml; charset=utf-8');
.
.
.
$response = sendOAuthBodyPOST($method, $endpoint, $oauth_consumer_key, $oauth_consumer_secret, $content_type, $postBody); //Call LMS with data
echo(utf8_encode($response)); //write the response XML
它应该是一个与平台无关的调用,所以我不应该能够操纵 sendOAuthBodyPost 调用另一端的内容。
如何修复输出编码以便 Flash 能够解析它?我是 PHP 新手,非常感谢任何帮助。
另一个注意事项:我可以使用 xmlData.child(index) 而不是 xmlData.child(name) 遍历 XMLFile.xml 结构,并且任何读取任何节点上的任何属性的尝试总是返回空。
文件 3 http://clsasset.coastlinelive.com/LTI/XMLFile3.xml:
<?xml version="1.0" encoding="UTF-8"?>
<imsx_POXEnvelopeResponse>
<imsx_POXHeader>
<imsx_POXResponseHeaderInfo>
<imsx_version>V1.0</imsx_version>
<imsx_messageIdentifier>524041811</imsx_messageIdentifier>
<imsx_statusInfo>
<imsx_codeMajor>success</imsx_codeMajor>
<imsx_severity>status</imsx_severity>
<imsx_description>Grade replace response</imsx_description>
<imsx_messageRefIdentifier>526f30b728966</imsx_messageRefIdentifier>
</imsx_statusInfo>
</imsx_POXResponseHeaderInfo>
</imsx_POXHeader>
<imsx_POXBody>
<replaceResultResponse />
</imsx_POXBody>
</imsx_POXEnvelopeResponse>