Coldfusion v9(9,0,0,251028)
这让我疯狂。我调用返回XML的oData Web服务。我正在使用xmlSearch()在xml中搜索给定节点,如下所示:
xmlS = xmlSearch(oXML,"/:SaveCustomerOutput/:MasterCustomerId");
writeOutput(arrayLen(xmlS));
这是存储在oXML中的xml:
<?xml version="1.0" encoding="UTF-8"?>
<SaveCustomerOutput xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MasterCustomerId>000000123456</MasterCustomerId>
<SubCustomerId>0</SubCustomerId>
<operationResult>true</operationResult>
</SaveCustomerOutput>
当搜索代码在上面的XML上执行时,我得到一个ColdFusion错误“前缀必须解析为命名空间。”
现在,如果服务出错,这就是返回的XML:
<?xml version="1.0" encoding="UTF-8"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code>PersonifyError</code>
<message xml:lang="US-EN">bla bla bla</message>
<innererror>
<message>Exception has been thrown by the target of an invocation.</message>
<type>System.Reflection.TargetInvocationException</type>
<stacktrace>Buncha technical stuff here</stacktrace>
<internalexception>
<message>Bla bla bla</message>
</internalexception>
<type>System.Data.Services.DataServiceException</type>
<stacktrace>You get the idea</stacktrace>
</innererror>
</error>
(为了简洁,我删除了内容和一些节点。)当搜索代码在该XML上执行时,我返回“0” - 好像数组是空的并且找不到节点。这按照预期的方式和我期望的方式工作。
所以我不明白为什么我可以搜索根本不存在的东西,这是第二位XML的情况,并获得预期的结果,但随后搜索应该存在的东西并得到一个错误。即使节点路径错误,我仍然希望得到一个“0”作为回报而不是错误。
我在其他地区使用xmlSearch没有这个问题。
有人可以解释我缺少的东西吗?
编辑:如果重要,以下是oXML的创建方式:
httpService = setHTTP("post",strSvcURL & "CreateIndividual");
httpService.addParam(type="XML",value=strXML.Trim());
httpResult = httpService.send().getPrefix();
oXML = XmlParse(httpResult.filecontent);
答案 0 :(得分:1)
该问题与CF 8/9的XPath引擎有关,而不考虑名称空间。有一个自定义语法来忽略名称空间(前导冒号),由于更改了XPath引擎,导致CF 10+中出现异常。
要解决此问题,您需要更改查询:
xmlS = xmlSearch(oXML,"//*[local-name()='SaveCustomerOutput']/MasterCustomerId");
这将仅检查节点的名称,从而忽略任何指定的命名空间。
答案 1 :(得分:0)
就我而言,我刚刚删除&#34;:&#34;,所以它看起来像
xmlS = xmlSearch(oXML,"/SaveCustomerOutput/MasterCustomerId");
希望它对某人有所帮助。