oracle 使用XMLTABLE从具有名称空间的XML中提取属性值

svmlkihl  于 2022-11-03  发布在  Oracle
关注(0)|答案(1)|浏览(499)

我有以下自包含的测试用例:(通过Oracle www.example.com客户端在Oracle 12.1上运行11.2.0.3)

SET SERVEROUTPUT ON
DECLARE
  xmldocX XMLType;
  r1X VARCHAR2(100);
  r2X VARCHAR2(100);
BEGIN
  xmldocX:=XMLType('<xmlZdroj>
    <zdrojdok typ="ELDP09">
      <eldp09 xmlns="http://schemas.cssz.cz/ELDP09" sqnr="1" yer="2009" typ="01" dep="660" nam="HB"></eldp09>
    </zdrojdok>
    </xmlZdroj>');

  SELECT sqnr,yer
  INTO r1X,r2X
  FROM xmltable(XMLNamespaces('http://schemas.cssz.cz/ELDP09' AS "xx"),  
    '/xx:xmlZdroj/xx:zdrojdok/xx:eldp09'
    PASSING xmldocX
    COLUMNS 
       sqnr VARCHAR2(10) PATH '@xx:sqnr',
       yer  VARCHAR2(10) PATH '@xx:yer'
       );

  DBMS_OUTPUT.PUT_LINE('result: '||nvl(r1X,'null')||'  '||nvl(r2X,'null'));
END;
/

如果我删除了ELDP09元素和XMLTABLE中的xmlns规范,代码就可以工作并给出预期的结果。你能告诉我如何在命名空间存在的情况下实现同样的效果吗?我也尝试过在XMLTABLE中使用默认的命名空间规范,但也没有用。

qyyhg6bp

qyyhg6bp1#

xmlns="http://schemas.cssz.cz/ELDP09"仅适用于xmlZdroj/zdrojdok/eldp09元素,其父元素没有此命名空间。
而且属性在XML文档中没有命名空间,所以也要从路径中删除命名空间。你可以检查这个关于属性命名空间的问题来了解更多细节:XML namespaces and attributes
将它们合在一起,您将得到:

with src(doc) as (
  select XMLType('<xmlZdroj>
    <zdrojdok typ="ELDP09">
      <eldp09 xmlns="http://schemas.cssz.cz/ELDP09" sqnr="1" yer="2009" typ="01" dep="660" nam="HB"></eldp09>
    </zdrojdok>
    </xmlZdroj>')
  from dual
)

select t.*
from src
  cross join xmltable(
    XMLNamespaces('http://schemas.cssz.cz/ELDP09' AS "xx"),  
    '/xmlZdroj/zdrojdok/xx:eldp09'
    PASSING src.doc
    COLUMNS 
       sqnr VARCHAR2(10) PATH '@sqnr',
       yer  VARCHAR2(10) PATH '@yer'
  ) t

| 序列号|叶尔|
| - -|- -|
| 一个|二〇 〇九年|
fiddle

相关问题