如果文件扩展名不是.xml,则MSXML2.DOMDocument对象必需的错误

时间:2013-07-16 23:11:34

标签: php vbscript xml-parsing msxml hta

使用应用程序从Web服务以XML格式检索运费。 Web服务基于PHP。客户端是VB脚本,特别是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文档必须有一个顶级元素。”这对我来说毫无意义。有一个名为I的顶级元素也添加到.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());

0 个答案:

没有答案