想要从Oracle表中获取一个XML节点



在oracle表中有一列存储XML。下面是值:

<Header xmlns="http://load.xyx.gen/gen1"/>
<Body xmlns="http://load.xyx.gen/" xmlns:soapenv="http://load.xyx.gen/" xmlns:xsi="http://load.xyx.gen/instance" xmlns:SOAP-ENV="http://load.xyx.gen/" xmlns:SOAP-ENC="http://load.xyx.gen/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ns2:handleEmploye xmlns:ns2="http://load.xyx.gen/emp1">
<ns2:reisterEmp>
<ns4:empName xmlns:ns4="http://load.xyx.gen/empName1">Mirac</ns4:empName>
<ns4:empId xmlns:ns4="http://load.xyx.gen/empId1">12</ns4:empId>
<ns4:empDep xmlns:ns4="http://load.xyx.gen/empDep1">Finance</ns4:empDep>
</ns2:reisterEmp>
</ns2:handleEmploye>
</Body>
</soapenv:Envelope>

现在我正在尝试获取empId,但出现以下错误:

ORA-31011: XML parsing failed ORA-19202: Error occurred in XML processing

我使用了来自此链接的参考但这对我不起作用。

SELECT XMLTYPE('<soapenv:Envelope xmlns:soapenv="http://load.xyx.gen/">
<Header xmlns="http://load.xyx.gen/gen1"/>
<Body xmlns="http://load.xyx.gen/" xmlns:soapenv="http://load.xyx.gen/" xmlns:xsi="http://load.xyx.gen/instance" xmlns:SOAP-ENV="http://load.xyx.gen/" xmlns:SOAP-ENC="http://load.xyx.gen/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ns2:handleEmploye xmlns:ns2="http://load.xyx.gen/emp1">
<ns2:reisterEmp>
<ns4:empName xmlns:ns4="http://load.xyx.gen/empName1">Mirac</ns4:empName>
<ns4:empId xmlns:ns4="http://load.xyx.gen/empId1">12</ns4:empId>
<ns4:empDep xmlns:ns4="http://load.xyx.gen/empDep1">Finance</ns4:empDep>
</ns2:reisterEmp>
</ns2:handleEmploye>
</Body>
</soapenv:Envelope>
').EXTRACT('//Body/ns2:handleEmploye/ns2:reisterEmp/ns4:empId/text()').getStringVal() result
FROM dual;

有人能提出建议吗?

您提到了ORA-31011和ORA-19202,但根据您所展示的内容,这些将由LPX-00601:引起

ORA-31011:XML分析失败
ORA-19202:XML处理中出错
LPX-00601:中的无效令牌:"//Body/ns2:handleEmployee/ns2:reisterEmp/ns4:empId/text((">

这是因为您的XML和XPath有命名空间引用(在修改后的XML中看起来有点混淆(,但您的extract()调用中没有包含命名空间映射:

SELECT XMLTYPE('...
').EXTRACT('//Body/ns2:handleEmploye/ns2:reisterEmp/ns4:empId/text()',
'xmlns="http://load.xyx.gen/" xmlns:ns2="http://load.xyx.gen/emp1" xmlns:ns4="http://load.xyx.gen/empId1"'
).getStringVal() result
FROM dual;
RESULT
12

相关内容

最新更新