如何在 Oracle 中通过 xmltype 解析 XML
How to parse XML by xmltype in Oracle
我在尝试解析 XML 文档时遇到了 XPath 属性 的一个小问题。
这是我的例子:
DECLARE
px_return XMLTYPE
:= XMLTYPE (
'<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP:Header xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<h:AxisValues xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:h="urn:/microsoft/multichannelframework/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:/microsoft/multichannelframework/">
<User xmlns="">FSCD</User>
<Solution xmlns="">Multicare</Solution>
<ApplicationalUser xmlns=""/>
<ApplicationalUserSystem xmlns=""/>
<SystemUser xmlns=""/>
<SystemUserSystem xmlns=""/>
<Proxy xmlns="">0</Proxy>
</h:AxisValues>
</SOAP:Header>
<SOAP:Body xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<ns1:maintainMandateResponse xmlns:ns1="urn:enterprise.com/ws/SAP/Finantial/MaintainMandate/V1">
<return>
<messageType>E</messageType>
</return>
</ns1:maintainMandateResponse>
</SOAP:Body>
</soapenv:Envelope>');
lv_msgType VARCHAR2 (20);
BEGIN
SELECT Return.msgType
INTO lv_msgType
FROM XMLTABLE (
xmlnamespaces (
DEFAULT 'enterprise.com/ws/SAP/Finantial/MaintainMandate/V1',
'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv",
'http://schemas.xmlsoap.org/soap/envelope/' AS "SOAP",
'enterprise.com/ws/SAP/Finantial/MaintainMandate/V1' AS "ns1"),
'//soapenv:Envelope/SOAP:Body/ns1:maintainMandateResponse'
PASSING px_return
COLUMNS msgType VARCHAR2 (1) PATH 'messageType') Return;
DBMS_OUTPUT.put_line ('Message type: ' || lv_msgType);
END;
我收到一个 NO_DATA_FOUND 异常,因为我无法在此解析方法中找到结果。
我尝试了很多不同的策略,包括将 return
放在 PATH 或 XQUery 字符串中,但都没有成功。
我认为这是一个小而简单的问题,但我找不到。
提前致谢!
菲利普
您的 ns1
命名空间声明中缺少 urn:
前缀。您还忽略了 <return>
节点级别,并且您有一个不正确的默认名称空间,因为您有没有任何名称空间的子节点。所以你需要:
SELECT Return.msgType
INTO lv_msgType
FROM XMLTABLE (
xmlnamespaces (
'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv",
'http://schemas.xmlsoap.org/soap/envelope/' AS "SOAP",
'urn:enterprise.com/ws/SAP/Finantial/MaintainMandate/V1' AS "ns1"),
'/soapenv:Envelope/SOAP:Body/ns1:maintainMandateResponse'
PASSING px_return
COLUMNS msgType VARCHAR2 (1) PATH 'return/messageType') Return;
其中得到:
PL/SQL procedure successfully completed.
Message type: E
当然你也可以将return移动到XPath中,这里的效果是一样的:
'/soapenv:Envelope/SOAP:Body/ns1:maintainMandateResponse/return'
PASSING px_return
COLUMNS msgType VARCHAR2 (1) PATH 'messageType') Return;
我在尝试解析 XML 文档时遇到了 XPath 属性 的一个小问题。 这是我的例子:
DECLARE
px_return XMLTYPE
:= XMLTYPE (
'<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP:Header xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<h:AxisValues xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:h="urn:/microsoft/multichannelframework/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:/microsoft/multichannelframework/">
<User xmlns="">FSCD</User>
<Solution xmlns="">Multicare</Solution>
<ApplicationalUser xmlns=""/>
<ApplicationalUserSystem xmlns=""/>
<SystemUser xmlns=""/>
<SystemUserSystem xmlns=""/>
<Proxy xmlns="">0</Proxy>
</h:AxisValues>
</SOAP:Header>
<SOAP:Body xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<ns1:maintainMandateResponse xmlns:ns1="urn:enterprise.com/ws/SAP/Finantial/MaintainMandate/V1">
<return>
<messageType>E</messageType>
</return>
</ns1:maintainMandateResponse>
</SOAP:Body>
</soapenv:Envelope>');
lv_msgType VARCHAR2 (20);
BEGIN
SELECT Return.msgType
INTO lv_msgType
FROM XMLTABLE (
xmlnamespaces (
DEFAULT 'enterprise.com/ws/SAP/Finantial/MaintainMandate/V1',
'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv",
'http://schemas.xmlsoap.org/soap/envelope/' AS "SOAP",
'enterprise.com/ws/SAP/Finantial/MaintainMandate/V1' AS "ns1"),
'//soapenv:Envelope/SOAP:Body/ns1:maintainMandateResponse'
PASSING px_return
COLUMNS msgType VARCHAR2 (1) PATH 'messageType') Return;
DBMS_OUTPUT.put_line ('Message type: ' || lv_msgType);
END;
我收到一个 NO_DATA_FOUND 异常,因为我无法在此解析方法中找到结果。
我尝试了很多不同的策略,包括将 return
放在 PATH 或 XQUery 字符串中,但都没有成功。
我认为这是一个小而简单的问题,但我找不到。 提前致谢! 菲利普
您的 ns1
命名空间声明中缺少 urn:
前缀。您还忽略了 <return>
节点级别,并且您有一个不正确的默认名称空间,因为您有没有任何名称空间的子节点。所以你需要:
SELECT Return.msgType
INTO lv_msgType
FROM XMLTABLE (
xmlnamespaces (
'http://schemas.xmlsoap.org/soap/envelope/' AS "soapenv",
'http://schemas.xmlsoap.org/soap/envelope/' AS "SOAP",
'urn:enterprise.com/ws/SAP/Finantial/MaintainMandate/V1' AS "ns1"),
'/soapenv:Envelope/SOAP:Body/ns1:maintainMandateResponse'
PASSING px_return
COLUMNS msgType VARCHAR2 (1) PATH 'return/messageType') Return;
其中得到:
PL/SQL procedure successfully completed.
Message type: E
当然你也可以将return移动到XPath中,这里的效果是一样的:
'/soapenv:Envelope/SOAP:Body/ns1:maintainMandateResponse/return'
PASSING px_return
COLUMNS msgType VARCHAR2 (1) PATH 'messageType') Return;