oracle - 如何使用 PL/SQL 过滤 XML 字符串
问题描述
我是 PL/SQL 编程的新手,我正在尝试编写我的第一个程序。
在 Oracle 数据库中,我有一个名为“ngg_basiscomponent”的表,其中包含一个名为“data”的列,其中包含一些 XML 字符串。这里是一个记录的例子:
<kenm>
<weergv>
<tekst aardVp="LO" hgtCe="2500" tekst="27">
<ripunt x="109007204" y="505639703"/>
</tekst>
</weergv>
<gdm:codes>
<gdm:code wrd="LKI|TYPE.HS"/>
<gdm:code wrd="LKI|GROOTTE.-"/>
<gdm:code wrd="LKI|SCHAAL.-"/>
</gdm:codes>
</kenm>
我想从这些 XML 字符串中删除<gdm:codes>
until中的部分</gdm:codes>
。
我设法通过使用以下查询来做到这一点:
update ngg_basiscomponent
set data = substr(data, 1, instr(data, regexp_substr(data, '<gdm:codes>.+</gdm:codes>'))-1)
|| substr(data, instr(data, regexp_substr(data, '<gdm:codes>.+</gdm:codes>'))
+ length(regexp_substr(data, '<gdm:codes>.+</gdm:codes>')))
where regexp_substr(data, '<gdm:codes>.+</gdm:codes>') is not null;
这行得通,但这是实现这一目标的一种丑陋的方式。如果我可以定义一个变量来存储以下部分,那就太好了:
regexp_substr(data, '<gdm:codes>.+</gdm:codes>')
它定义了必须删除的部分。我试图通过使用一些 PL/SQL 代码来弄清楚如何做到这一点。如何使用 PL/SQL 获得相同的结果?
解决方案
DELETEXML 是您需要的。请看下面的演示:
--Created table
create table tb as
SELECT
xmltype('<?xml version="1.0"?>
<kenm>
<weergv>
<tekst aardVp="LO" hgtCe="2500" tekst="27">
<ripunt x="109007204" y="505639703"/>
</tekst>
</weergv>
<gdm>
<gdm wrd="LKI|TYPE.HS"/>
<gdm wrd="LKI|GROOTTE.-"/>
<gdm wrd="LKI|SCHAAL.-"/>
</gdm>
</kenm>') col
FROM dual
-----------
--Selecting
Select * from tb;
--Output:
<?xml version="1.0"?>
<kenm>
<weergv>
<tekst aardVp="LO" hgtCe="2500" tekst="27">
<ripunt x="109007204" y="505639703"/>
</tekst>
</weergv>
<gdm>
<gdm wrd="LKI|TYPE.HS"/>
<gdm wrd="LKI|GROOTTE.-"/>
<gdm wrd="LKI|SCHAAL.-"/>
</gdm>
</kenm>
----------
--Deleting
Update tb set col = DELETEXML(col,'/kenm/gdm');
---------
Select * from tb;
Output:
<?xml version="1.0"?>
<kenm>
<weergv>
<tekst aardVp="LO" hgtCe="2500" tekst="27">
<ripunt x="109007204" y="505639703"/>
</tekst>
</weergv>
</kenm>
推荐阅读
- google-cloud-platform - 为云 AutoML 导入谷歌云时出错
- javascript - Content Security Policy
- python - 分发关键字参数的最佳方法?
- node.js - MEAN stack app not opens from instagram profile
- amazon-web-services - s3列表对象使用sdk返回null
- asp.net-core - Using yarn to add a package removes existing modules
- ios - iPhone XR 返回正确的 nativeBounds 但设备上的屏幕尺寸错误
- javascript - How to insert record to SharePoint List Multi Choice Field
- python - SQLAlchemy 多对多与多个表的单个链接
- python - ValueError: filedescriptor out of range in select()