我的表中有一个 CLOB XML 列,其中包含我想要提取的某些字段。这里的问题是,其中一些字段具有多个属性,有时不同行的属性不同。例如:
...
<DataPDU>
<Body>
<AppHdr xmlns="xyz..." xmlns:xsi="abc..">
<Fr>
...
有没有办法使用 XMLTABLE 查询来匹配具有任何属性的路径?例如,对于上面的例子,如
path AppHdr[@*]/Fr
?
目前,我能够提取所需字段的唯一方法是首先删除我看到的所有 xmlns 属性,然后将其传递给 XMLTABLE 函数,如下面的代码所示:
select x.*
from msg m,
xmltable(
'\DataPDU\Body'
passing xmltype(regexp_replace(m.message, 'xmlns(:(bmi|Sw|SwInt|xsi))?="\S+"', ''))
columns
sender varchar2(20) path 'AppHdr/Fr/Id/InstnId/FI',
receiver varchar2(20) path 'AppHdr/To/Id/InstnId/FI'
...
) x
我非常确定这是一种做我想做的事情的复杂方式。但我只看到将单个属性与 XMLTABLE 匹配的示例
XML 有命名空间。这就是为什么需要通过
xmlnamespaces (...)
声明它们,并在 columns 子句 XPath 表达式中使用它们。
SQL
select x.*
from msg m,
xmltable(xmlnamespaces ('xyz...' AS "d"),
'/DataPDU/Body'
passing xmltype(m.message)
columns
sender varchar2(20) path 'd:AppHdr/d:Fr/d:Id/d:InstnId/d:FI',
receiver varchar2(20) path 'd:AppHdr/d:To/d:Id/d:InstnId/d:FI'
...
) x