从 ORACLE 中的 CLOB 字段中解析 Xml 个节点值
Parse Xml node values from CLOB field in ORACLE
我正在尝试从 CLOB 字段解析 XML 节点值,它抛出无效令牌错误:
XML:
create table traptabclob(testclob clob);
insert into traptabclob values('<?xml version="1.0" encoding="UTF-8"?>
<tns:InputOutputScoringDetails xmlns:tns="jdhajdjh" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="dasd.xsd ">
<tns:InputsOutputs>
<tns:NameValue>
<tns:Name>ABSC_APPLICANTBUREAUSCORE</tns:Name>
<tns:Value>0.11030000000000001</tns:Value>
</tns:NameValue>
<tns:NameValue>
<tns:Name>ABS_BN_SCORE_DETAIL_PK</tns:Name>
<tns:Value>10035</tns:Value>
</tns:NameValue>
</tns:InputsOutputs>
</tns:InputOutputScoringDetails>
');
SQL 查询:
SELECT EXTRACTVALUE(xmltype(testclob), '/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue[1]/tns:Name')
FROM traptabclob;
任何人都可以帮助我如何使用 xmltype 和 extractvalue 来提取名称或值节点的值?
谢谢
无效标记是 tns:
命名空间前缀。您需要提供 tns
命名空间信息作为查询的一部分:
SELECT EXTRACTVALUE(
xmltype(testclob),
'/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue[1]/tns:Name',
'xmlns:tns="jdhajdjh"'
) AS result
FROM traptabclob;
尽管 extractvalue
已被弃用很长时间,因此您可以改用 XMLQuery:
SELECT XMLQuery(
'declare namespace tns="jdhajdjh";
/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue[1]/tns:Name/text()'
PASSING xmltype(testclob)
RETURNING CONTENT
) AS result
FROM traptabclob;
两者都得到:
RESULT
-------------------------
ABSC_APPLICANTBUREAUSCORE
根据您的操作,您可能会发现使用 XMLTable 更方便:
SELECT x.name, x.value
FROM traptabclob t
CROSS APPLY XMLTable(
XMLNamespaces ('jdhajdjh' AS "tns"),
'/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue'
PASSING xmltype(testclob)
COLUMNS
name VARCHAR2(30) PATH 'tns:Name',
value NUMBER PATH 'tns:Value'
) x;
得到:
NAME VALUE
------------------------------ --------------------
ABSC_APPLICANTBUREAUSCORE .11030000000000001
ABS_BN_SCORE_DETAIL_PK 10035
我正在尝试从 CLOB 字段解析 XML 节点值,它抛出无效令牌错误: XML:
create table traptabclob(testclob clob);
insert into traptabclob values('<?xml version="1.0" encoding="UTF-8"?>
<tns:InputOutputScoringDetails xmlns:tns="jdhajdjh" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="dasd.xsd ">
<tns:InputsOutputs>
<tns:NameValue>
<tns:Name>ABSC_APPLICANTBUREAUSCORE</tns:Name>
<tns:Value>0.11030000000000001</tns:Value>
</tns:NameValue>
<tns:NameValue>
<tns:Name>ABS_BN_SCORE_DETAIL_PK</tns:Name>
<tns:Value>10035</tns:Value>
</tns:NameValue>
</tns:InputsOutputs>
</tns:InputOutputScoringDetails>
');
SQL 查询:
SELECT EXTRACTVALUE(xmltype(testclob), '/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue[1]/tns:Name')
FROM traptabclob;
任何人都可以帮助我如何使用 xmltype 和 extractvalue 来提取名称或值节点的值?
谢谢
无效标记是 tns:
命名空间前缀。您需要提供 tns
命名空间信息作为查询的一部分:
SELECT EXTRACTVALUE(
xmltype(testclob),
'/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue[1]/tns:Name',
'xmlns:tns="jdhajdjh"'
) AS result
FROM traptabclob;
尽管 extractvalue
已被弃用很长时间,因此您可以改用 XMLQuery:
SELECT XMLQuery(
'declare namespace tns="jdhajdjh";
/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue[1]/tns:Name/text()'
PASSING xmltype(testclob)
RETURNING CONTENT
) AS result
FROM traptabclob;
两者都得到:
RESULT
-------------------------
ABSC_APPLICANTBUREAUSCORE
根据您的操作,您可能会发现使用 XMLTable 更方便:
SELECT x.name, x.value
FROM traptabclob t
CROSS APPLY XMLTable(
XMLNamespaces ('jdhajdjh' AS "tns"),
'/tns:InputOutputScoringDetails/tns:InputsOutputs/tns:NameValue'
PASSING xmltype(testclob)
COLUMNS
name VARCHAR2(30) PATH 'tns:Name',
value NUMBER PATH 'tns:Value'
) x;
得到:
NAME VALUE
------------------------------ --------------------
ABSC_APPLICANTBUREAUSCORE .11030000000000001
ABS_BN_SCORE_DETAIL_PK 10035