如何在pl-sql中解析xml?
Posted
技术标签:
【中文标题】如何在pl-sql中解析xml?【英文标题】:How to parse xml in pl-sql? 【发布时间】:2015-09-03 11:33:01 【问题描述】:我有一个包含 xml 和虚拟文本的字符串,如下所示。
我需要读取值 Hello world 和 999。
你能帮忙吗?
[GCM] Dummy text1
[GCM] Dummy text2
<PARAMETER_LIST>
<PARAMETER>
<NAME>SMS</NAME>
<VALUE>Hello world</VALUE>
</PARAMETER>
<PARAMETER>
<NAME>ERROR_CODE</NAME>
<VALUE>999</VALUE>
</PARAMETER>
</PARAMETER_LIST>
【问题讨论】:
【参考方案1】:另外,您可能想使用 XMLTABLE:
SELECT
px.*
FROM
XMLTABLE(
'/PARAMETER_LIST/PARAMETER' PASSING
XMLTYPE(
REGEXP_REPLACE('
[GCM] Dummy text1
[GCM] Dummy text2
<PARAMETER_LIST>
<PARAMETER>
<NAME>SMS</NAME>
<VALUE>Hello world</VALUE>
</PARAMETER>
<PARAMETER>
<NAME>ERROR_CODE</NAME>
<VALUE>999</VALUE>
</PARAMETER>
</PARAMETER_LIST>'
,'^[^<]+'
,''
)
)
COLUMNS param_id FOR ORDINALITY
,name VARCHAR2(40) PATH 'NAME'
,value VARCHAR2(400) PATH 'VALUE'
) px;
这会给你结果:
PARAM_ID | NAME | VALUE
------------------------------------------
1 | SMS | Hello world
2 | ERROR_CODE | 999
此外,Shaun Peterson 的解决方案稍作调整(无需切换 PLSQL - SQL 上下文):
declare
MY_STRING VARCHAR2(4000) := '[GCM] DUMMY TEXT1 [GCM] DUMMY TEXT2 <PARAMETER_LIST><PARAMETER><NAME>SMS</NAME><VALUE>Hellow world</VALUE></PARAMETER><PARAMETER><NAME>ERROR_CODE</NAME><VALUE>999</VALUE></PARAMETER></PARAMETER_LIST>';
MY_XML XMLTYPE;
MY_SMS VARCHAR2(100);
MY_ERROR_CODE VARCHAR2(100);
begin
MY_XML := XMLTYPE(SUBSTR(MY_STRING, INSTR(MY_STRING, '<'))) ;
MY_SMS := MY_XML.EXTRACT('/PARAMETER_LIST/PARAMETER[NAME="SMS"]/VALUE/text()').getstringval;
MY_ERROR_CODE := MY_XML.EXTRACT('/PARAMETER_LIST/PARAMETER[NAME="ERROR_CODE"]/VALUE/text()').getstringval;
DBMS_OUTPUT.PUT_LINE('MY_SMS = ' || MY_SMS);
DBMS_OUTPUT.PUT_LINE('MY_ERROR_CODE = ' || MY_ERROR_CODE);
end;
【讨论】:
【参考方案2】:您好,我将从该字符串中提取 xml,将其放入 xml 类型中,然后从那里进行处理。请参阅下面的示例。
declare
MY_STRING VARCHAR2(4000) := '[GCM] DUMMY TEXT1 [GCM] DUMMY TEXT2 <PARAMETER_LIST><PARAMETER><NAME>SMS</NAME><VALUE>Hellow world</VALUE></PARAMETER><PARAMETER><NAME>ERROR_CODE</NAME><VALUE>999</VALUE></PARAMETER></PARAMETER_LIST>';
MY_XML XMLTYPE;
MY_SMS VARCHAR2(100);
MY_ERROR_CODE VARCHAR2(100);
begin
SELECT XMLTYPE(SUBSTR(MY_STRING, INSTR(MY_STRING, '<')))
INTO MY_XML
FROM DUAL;
SELECT EXTRACTVALUE(MY_XML, '/PARAMETER_LIST/PARAMETER[NAME="SMS"]/VALUE'),
EXTRACTVALUE(MY_XML, '/PARAMETER_LIST/PARAMETER[NAME="ERROR_CODE"]/VALUE')
INTO MY_SMS, MY_ERROR_CODE
FROM DUAL;
DBMS_OUTPUT.PUT_LINE('MY_SMS = ' || MY_SMS);
DBMS_OUTPUT.PUT_LINE('MY_ERROR_CODE = ' || MY_ERROR_CODE);
end;
这会给你输出
MY_SMS = Hellow World
MY_ERROR_CODE = 999
【讨论】:
以上是关于如何在pl-sql中解析xml?的主要内容,如果未能解决你的问题,请参考以下文章