我正在使用返回以下输出的Web服务。我很难从输出中构建XMLTYPE变量。尝试输出CreateUserSessionFromInstanceResult
ORA-30625:禁止对NULL SELF参数进行方法调度
procedure xmltest is
str_xml varchar2(32000);
v_xml XMLTYPE;
BEGIN
str_xml :='<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<CreateUserSessionFromInstanceResponse xmlns="http://archer-tech.com/webservices/">
<CreateUserSessionFromInstanceResult>4FFABEE05C4910A31FEC75D5FEDCDFB5</CreateUserSessionFromInstanceResult>
</CreateUserSessionFromInstanceResponse>
</soap:Body>
</soap:Envelope>';
v_xml := XMLTYPE(str_xml);
HTP.P(v_xml.extract('//CreateUserSessionFromInstanceResult/text()').getstringval());
END;
答案 0 :(得分:2)
错误在这一行
HTP.P(v_xml.extract('//CreateUserSessionFromInstanceResult/text()').getstringval());
您收到错误是因为您的XPath表达式
//CreateUserSessionFromInstanceResult/text()
不匹配,因此extract(...)
会返回NULL
。当然,您无法在getstringval()
上致电NULL
,因此您会看到错误。
XPath不匹配的原因是名称空间。 xmlns
元素上的<CreateUserSessionFromInstanceResponse>
属性将此元素的名称空间及其包含的<CreateUserSessionFromInstanceResult>
元素的名称空间设置为"http://archer-tech.com/webservices/"
。另一方面,您的XPath表达式正在默认命名空间CreateUserSessionFromInstanceResult
中搜索名称为""
的元素。
修复是向extract
添加第三个参数来声明此命名空间。您可以按照XML中显示的相同方式执行此操作:
HTP.P(v_xml.extract('//CreateUserSessionFromInstanceResult/text()',
'xmlns="http://archer-tech.com/webservices/"').getstringval());
答案 1 :(得分:0)
我遇到了类似的情况,但添加额外参数对我不起作用。
对我来说,解决方案是在使用 getstringval 之前检查节点是否存在并进行空检查,如下所示:
if v_xml.existsnode('//CreateUserSessionFromInstanceResult', 'xmlns="http://archer-tech.com/webservices/"') > 0 and v_xml.extract('//CreateUserSessionFromInstanceResult/text()', 'xmlns="http://archer-tech.com/webservices/"') is not null then
HTP.P(v_xml.extract('//CreateUserSessionFromInstanceResult/text()', 'xmlns="http://archer-tech.com/webservices/"').getstringval());
end if;
只做空检查可能就足够了。