ColdFusion(cfscript)xmlSearch导致“前缀必须解析为命名空间”

时间:2015-10-07 20:27:26

标签: xml coldfusion

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);

2 个答案:

答案 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");

希望它对某人有所帮助。