Sql 使用名称空间提取XML标记
我需要提取一个XML标记值,如下面的代码所示Sql 使用名称空间提取XML标记,sql,xml,plsql,xml-namespaces,Sql,Xml,Plsql,Xml Namespaces,我需要提取一个XML标记值,如下面的代码所示 打开服务器输出 声明 lv_xml varchar2(500); xmlstring-XMLTYPE; 瓦查尔2号(10); 开始 lv_xml:= ' 瓦尔1 VAL 2 VAL 3 '; xmlstring:=XMLTYPE.CREATEXML(lv_xml); 选择提取值(值(fd),'testTag2') 进入吕瓦尔 从表(XMLSEQUENCE(xmlstring.EXTRACT('TestMain'))f, 表(XMLSEQUENCE)(
打开服务器输出
声明
lv_xml varchar2(500);
xmlstring-XMLTYPE;
瓦查尔2号(10);
开始
lv_xml:=
'
瓦尔1
VAL 2
VAL 3
';
xmlstring:=XMLTYPE.CREATEXML(lv_xml);
选择提取值(值(fd),'testTag2')
进入吕瓦尔
从表(XMLSEQUENCE(xmlstring.EXTRACT('TestMain'))f,
表(XMLSEQUENCE)(提取值(f),
'TestMain/testTag2'))fd;
dbms_output.put_line('Val:'| | lv|Val);
例外情况
当其他人
dbms|u output.put|u行('Error:'|| SQLCODE |'.| SQLERRM);
结束;
/
当我运行它时,我得到一个异常ORA-01403:找不到数据
我发现,如果删除XML名称空间xmlns=”http://www.w3.org/2001/XMLSchema-instance“
,那么它工作正常。但是,我将从中提取值的XML流将采用这种格式(即,它将包含一个名称空间)
有没有任何方法可以在存在xmlns的情况下提取值?给您:
declare
lv_xml varchar2(500);
xmlstring XMLTYPE;
lv_val varchar2(10);
BEGIN
lv_xml :=
'<?xml version="1.0" encoding="UTF-8"?>
<TestMain xmlns="http://www.w3.org/2001/XMLSchema-instance">
<testTag1>VAL 1</testTag1>
<testTag2>VAL 2</testTag2>
<testTag3>VAL 3</testTag3>
</TestMain>';
xmlstring := XMLTYPE.CREATEXML(lv_xml);
SELECT EXTRACTVALUE(VALUE(fd), '.')
INTO lv_val
FROM TABLE(XMLSEQUENCE(xmlstring.EXTRACT('/TestMain', 'xmlns="http://www.w3.org/2001/XMLSchema-instance"'))) f,
TABLE(XMLSEQUENCE(EXTRACT(VALUE(f), '/TestMain/testTag2', 'xmlns="http://www.w3.org/2001/XMLSchema-instance"'))) fd
;
dbms_output.put_line('Val: '||lv_val);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error: '||SQLCODE||' '||SQLERRM);
END;
/
或者更具可读性(尽管功能上并非100%相同)
10秒钟的搜索将查找的文档,该文档指示它可以使用另一个名为
namespace\u string
的可选参数。
SELECT EXTRACTVALUE(xmlstring, '/TestMain/testTag2', 'xmlns="http://www.w3.org/2001/XMLSchema-instance"')
INTO lv_val
FROM dual;
lv_val := xmlstring.extract('/TestMain/testTag2/text()', 'xmlns="http://www.w3.org/2001/XMLSchema-instance"').getStringVal();