XMLTABLE 从具有多个属性的 CLOB XML 中提取值

问题描述 投票:0回答:1

我的表中有一个 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 oracle clob xmltable
1个回答
0
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.