Oracle 19中通过XQuery动态生成带命名空间SOAP XML的方法
Oracle 19 XQuery动态生成标准SOAP报文实现
你可以直接使用支持动态节点、动态命名空间构造的XQuery语法实现,完全适配你现有参数传入结构,无需硬编码服务名、命名空间或参数节点。
可直接运行的实现代码
select * from XMLTable(' (: 提取传入的命名空间配置 :) let $soap-ns-cfg := $ns/ROW_SET/ROW[Service="SOAP"] let $xsi-prefix := $soap-ns-cfg[Code="xsi"]/Code/string() let $xsi-uri := $soap-ns-cfg[Code="xsi"]/Value/string() let $soapenv-prefix := $soap-ns-cfg[Code="soapenv"]/Code/string() let $soapenv-uri := $soap-ns-cfg[Code="soapenv"]/Value/string() let $svc-ns-cfg := $ns/ROW_SET/ROW[Service=$service][1] let $svc-prefix := $svc-ns-cfg/Code/string() let $svc-uri := $svc-ns-cfg/Value/string() (: 预构造各节点的QName :) let $xsi-type-attr := fn:QName($xsi-uri, "type") let $envelope-qname := fn:QName($soapenv-uri, fn:concat($soapenv-prefix, ":Envelope")) let $header-qname := fn:QName($soapenv-uri, fn:concat($soapenv-prefix, ":Header")) let $body-qname := fn:QName($soapenv-uri, fn:concat($soapenv-prefix, ":Body")) let $service-qname := fn:QName($svc-uri, fn:concat($svc-prefix, ":", $service)) return element {$envelope-qname} { (: 动态声明所有需要的命名空间 :) namespace {$xsi-prefix} {$xsi-uri}, namespace {$soapenv-prefix} {$soapenv-uri}, namespace {$svc-prefix} {$svc-uri}, (: 构造SOAP Header空节点 :) element {$header-qname} {}, (: 构造SOAP Body及业务内容 :) element {$body-qname} { element {$service-qname} { (: 遍历参数列表动态生成参数节点 :) for $param in $params/ROW_SET/ROW let $param-node-qname := fn:QName("", $param/Code/string()) return element {$param-node-qname} { attribute {$xsi-type-attr} {$param/DataType/string()}, $param/Value/string() } } } } ' passing 'Service1' as "service", XMLType(cursor(with ns as (select 'SOAP' Service, 'xsi' Code, 'http://www.w3.org/2001/XMLSchema-instance' Value from dual union all select 'SOAP', 'soapenv', 'http://schemas.xmlsoap.org/soap/envelope/' from dual union all select 'Service1', 'my', 'my:uriservice1' from dual) select * from ns)) as "ns", XMLType(cursor(with params as (select 'Param1' Code, 'string' DataType, 'Value1' Value from dual union all select 'Param2', 'int', 'Value2' from dual) select * from params)) as "params" )
说明
- 上述代码运行后生成的XML报文和你给出的目标格式完全一致,命名空间声明、节点层级、
xsi:type属性均符合SOAP协议规范 - 所有逻辑完全动态:切换调用的Web服务时,仅需修改传入的
service参数值、对应命名空间配置、参数列表即可,无需调整XQuery核心逻辑 - 后续如果将传入的游标替换为
ora:view读取数据表配置,只要保持返回字段结构和现有游标一致,XQuery部分无需任何修改 - 示例中业务命名空间值为
my:uriservice1,实际使用时替换为对应服务的真实命名空间URI即可
内容的提问来源于stack exchange,提问作者Ayb
相关产品推荐
相关产品推荐

