1

开发一个应用程序以从 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());
4

0 回答 0