我是Oracle中XML解析的新手,我得到ORA-19202:XML处理和LPX-00601中发生错误:以下查询的令牌无效。谁能帮忙吗?
TABLENAME = PARSEXML
COLUMN1('ID') = VARCHAR |COLUMN2('XML') = CLOB
<?xml version="1.0" encoding="UTF-8"?>
<ns4:TSTCLOB xmlns:ns4="http://example.org/test" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ns4:Rqst>
<ns2:Initiation>
<ns2:InitiationDetail>
<ns3:Channel>WEB</ns3:Channel>
<ns3:Unit>ABCD</ns3:Unit>
</ns2:InitiationDetail>
</ns2:Initiation>
</ns4:Rqst>
</ns4:TSTCLOB>
SELECT ID, EXTRACT(xmltype(XML), '\ns4:TSTCLOB\ns4:Rqst\ns2:Initiation\ns2:InitiationDetail\ns3:Unit') "unit"
FROM PARSEXML WHERE ID = '123'
答案 0 :(得分:0)
尝试这种方法(简化XML以进行测试):
with tmp as(
select
xmltype(to_clob('<?xml version="1.0" encoding="UTF-8"?>
<TSTCLOB>
<Rqst>
<Initiation>
<InitiationDetail>
<Channel>WEB</Channel>
<Unit>ABCD</Unit>
</InitiationDetail>
</Initiation>
</Rqst>
</TSTCLOB>')) tmp_xml
from dual)
select
xml_tbl.Channel,
xml_tbl.Unit
from
tmp,
xmltable(
'/TSTCLOB/Rqst/Initiation/InitiationDetail' passing tmp.tmp_xml
columns
Channel varchar2(6) path 'Channel',
Unit varchar2(6) path 'Unit') xml_tbl
答案 1 :(得分:0)
1)您的示例xml无效。它使用4个命名空间,但仅声明2个。您必须添加此xmlns:ns2="Namespace2" xmlns:ns3="Namespace3"
<ns4:TSTCLOB xmlns:ns4="http://example.org/test" xmlns:ns2="Namespace2" xmlns:ns3="Namespace3" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<ns4:Rqst>
<ns2:Initiation>
<ns2:InitiationDetail>
<ns3:Channel>WEB</ns3:Channel>
<ns3:Unit>ABCD</ns3:Unit>
</ns2:InitiationDetail>
</ns2:Initiation>
</ns4:Rqst>
</ns4:TSTCLOB>
2)在xpath中,必须使用斜杠而不是反斜杠\
-> /
= '/ns4:TSTCLOB/ns4:Rqst/ns2:Initiation/ns2:InitiationDetail/ns3:Unit'
3)提取方法具有3个参数,最后一个是名称空间字符串。如果您的xml使用默认名称空间以外的其他名称空间,则必须在extract方法中指定此名称。
Extract(xml, '/ns4:TSTCLOB/ns4:Rqst/ns2:Initiation/ns2:InitiationDetail/ns3:Unit','xmlns:ns4="http://example.org/test" xmlns:ns2="Namespace2" xmlns:ns3="Namespace3" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"')
4 *)Extract,ExtractValue
已过时,应使用xmltable
或xmlquery