如何从XMLTYPE中提取第一个节点值



我有一个xml,它在我的表的clob字段中

这是我目前使用的代码:

create table
xml_key
(  
mycol number,
xml   clob
);

insert into xml_key
values(1653,
'<AppHdr>
<Fr>
<FIId>
<FinInstnId>
<BICFI>CRESUS33</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<BICFI>CAYTTRISXXX</BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>e9aab4a5-bc32-4548-93f6-aa47dd97d77</BizMsgIdr>
<MsgDefIdr>pac.004.001.09</MsgDefIdr>
<BizSvc>swift.cbprplus.02</BizSvc>
<CreDt>2019-08-12T13:59:26+01:00</CreDt>
<Rltd>
<Fr>
<FIId>
<FinInstnId>
<BICFI>LOYDGB21002</BICFI>
</FinInstnId>
</FIId>
</Fr>
<To>
<FIId>
<FinInstnId>
<BICFI>CRESUS33</BICFI>
</FinInstnId>
</FIId>
</To>
<BizMsgIdr>1234567890</BizMsgIdr>
<MsgDefIdr>pacs.008.001.08</MsgDefIdr>
<CreDt>2019-08-12T12:59:26+01:00</CreDt>
</Rltd>
</AppHdr>');

当我从xml中提取BIC代码时,我遇到了一个问题。我不想要像CRESUS33LOYDGB21002这样的双节点如何从xml中仅提取CRESUS33作为FromBIC?

select XMLTYPE(t.xml).EXTRACT('//Fr/FIId/FinInstnId/BICFI/text()').getStringVal()  fromBIC,
XMLTYPE(t.xml).EXTRACT('//Rltd/Fr/FIId/FinInstnId/BICFI/text()').getStringVal()  RltdFromBIC
from xml_key t
where mycol=1653 ;

FROMBIC                           RLTDFROMBIC
--------------------------------- --------------------------------------
CRESUS33LOYDGB21002               LOYDGB21002

谢谢

问题是,在两个提取调用中都使用//Fr作为快捷方式,而由于Fr是直接位于AppHdrAppHdr/Rltd下的节点,因此第一个XPath与这两个节点匹配,最终将两者的值组合在一起。第二个Xpath更具选择性,因此只能看到第二个。

如果你给出两者的完整路径,那么你就不会有这个问题:

select XMLTYPE(t.xml).EXTRACT('/AppHdr/Fr/FIId/FinInstnId/BICFI/text()').getStringVal()  fromBIC,
XMLTYPE(t.xml).EXTRACT('/AppHdr/Rltd/Fr/FIId/FinInstnId/BICFI/text()').getStringVal()  RltdFromBIC
from xml_key t
where mycol=1653 ;

您还可以使用XMLQuery:

select
XMLQuery('/AppHdr/Fr/FIId/FinInstnId/BICFI/text()'
passing XMLTYPE(t.xml)
returning content).getStringVal() as fromBIC,
XMLQuery('/AppHdr/Rltd/Fr/FIId/FinInstnId/BICFI/text()'
passing XMLTYPE(t.xml)
returning content).getStringVal() as RltdFromBIC
from xml_key t
where mycol=1653;

或XMLTable:

select x.fromBIC, x.RltdFromBIC
from xml_key t
cross apply XMLTable(
'/AppHdr'
passing XMLTYPE(t.xml)
columns
fromBIC path 'Fr/FIId/FinInstnId/BICFI',
RltdFromBIC path 'Rltd/Fr/FIId/FinInstnId/BICFI'
) x
where mycol=1653;
>LOYDGB21002
FROMBICRLTDFROMBIC
CRESUS33

最新更新