开发一个应用程序以从 Web 服务中以 XML 格式检索运费。Web 服务是基于 PHP 的。客户端是 VB Script,特别是 HTA。
在最初的开发过程中,我在服务器上使用了一个 XML 文件作为测试。这是该文件的内容:
<shipping>
<rate>
<method>FEDEX GROUND</method>
<description>FedEx Ground</description>
<amount>10.00</amount>
</rate>
<rate>
<method>FEDEX 2 DAY</method>
<description>FedEx 2nd Day</description>
<amount>20.00</amount>
</rate>
<rate>
<method>FEDEX NEXT DAY</method>
<description>FedEx Next Day</description>
<amount>30.00</amount>
</rate>
</shipping>
当我使用 MSXML2.ServerXMLHTTP 获取该文件时,使用 MSXML2.DOMDocument 解析 XML 没有问题。
如果我尝试从 PHP 脚本中获取完全相同的 XML,或者即使我将 XML 文件复制到具有非 xml 扩展名的文件名(如 .txt),我也会在尝试访问文档元素时收到 Object Required 错误。
从 PHP 获取数据时,我正在设置标头,如下所示:
header('Content-Type: application/xml; charset=utf-8');
这是VB脚本代码:
Set xmlhttp = CreateObject("MSXML2.ServerXMLHTTP")
xmlhttp.open "GET", "http://craig.clearos.lan/c9pets/api/shippingRates", False
xmlhttp.send
results=xmlhttp.ResponseText
Set xmlDoc = CreateObject("MSXML2.DOMDocument")
xmlDoc.load(xmlhttp.responseXML)
Set ratesNodeCollection = xmlDoc.DocumentElement.getElementsByTagName("rate")
此错误在最后一行出现“需要对象:'xmlDoc.DocumentElement'”
如果我将第 2 行更改为此
'xmlhttp.open "GET", "http://craig.clearos.lan/sage/hello.xml", False
它按预期工作。
同样,我已验证 PHP 代码和 .txt 文件包含与 .xml 文件完全相同的 XML。
我添加了 parseError 捕获,并且收到消息“XML 文档必须具有顶级元素”。这对我来说毫无意义。有一个名为的顶级元素,我也添加到了 .xml 文件和 PHP 的输出中。这并没有改变什么。我尝试将标头设置为 text/xml 而不是 application/xml,这也没有做任何事情。
这里的参考是构建 XML 的非常简单的 php 代码。
$shipping=array(0=>array('method'=>'FEDEX GROUND', 'description'=>'FedEx Ground', 'amount'=>'10.00'),
1=>array('method'=>'FEDEX 2 DAY', 'description'=>'FedEx 2nd Day', 'amount'=>'20.00'),
2=>array('method'=>'FEDEX NEXT DAY', 'description'=>'FedEx Next Day', 'amount'=>'30.00'));
$xml=new SimpleXMLElement('<shipping/>');
foreach($shipping as $row){
$rate=$xml->addChild('rate');
$rate->addChild('method', $row['method']);
$rate->addChild('description', $row['description']);
$rate->addChild('amount', $row['amount']);
}
Header('Content-type: application/xml');
print($retVal->asXML());