0

我正在使用 Oracle 的 XMLQuery 数据库函数来读取 SOAP Webservice 响应,但是响应元素“result”包括命名空间子句 (xmlns="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types /") 旁边的元素名称,因此 XMLQuery 无法读取元素的值。

这是我收到的 Webservice 响应正文,我正在尝试阅读“结果”

<env:Body>
        <ns0:getFlowTaskInstanceStatusResponse xmlns:ns0="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/">
        <result xmlns="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/">COMPLETED</result>
        </ns0:getFlowTaskInstanceStatusResponse>
</env:Body>

.
The following Select statement returns NULL


SELECT xmlcast(XMLQuery('//result' PASSING l_xmldata RETURNING CONTENT) as varchar2(900))
  into l_extract
  from dual;

如果我从 XML 响应中删除命名空间文本,XMLQuery 函数将返回“COMPLETED”!!!然而,这不是一个实际的解决方法。

BR汉尼

4

1 回答 1

0

您有两个选择(我添加了一个“env”命名空间以使 xml 有效):

在查询中包含命名空间:

WITH test AS
  (SELECT xmltype(' 
<env:Body xmlns:env="myenv">        
<ns0:getFlowTaskInstanceStatusResponse xmlns:ns0="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/">        
<result xmlns="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/">COMPLETED</result>        
</ns0:getFlowTaskInstanceStatusResponse>
</env:Body>') AS data
  FROM dual
  )
SELECT CAST( extractValue(test.data, '//ns0:result','xmlns:env="myenv" xmlns:ns0="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/') AS VARCHAR2(900) )
FROM test

忽略命名空间

WITH test AS
  (SELECT xmltype(' 
<env:Body xmlns:env="myenv">        
<ns0:getFlowTaskInstanceStatusResponse xmlns:ns0="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/">        
<result xmlns="http://xmlns.oracle.com/apps/hcm/processFlows/core/flowActionsService/types/">COMPLETED</result>        
</ns0:getFlowTaskInstanceStatusResponse>
</env:Body>') AS data
  FROM dual
  )
SELECT CAST( extractValue(test.data, '//*[local-name() = "result"]') AS VARCHAR2(900) )
FROM test
于 2019-09-07T20:33:17.627 回答