Oracle XML解析-ORA-19202和LPX-00601

时间:2018-08-07 00:53:21

标签: oracle xml-parsing

我是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'

2 个答案:

答案 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)您的示例x​​ml无效。它使用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已过时,应使用xmltablexmlquery