oracle SQL 多行字符串和 XML 之间的子字符串

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

我正在寻找 2 个其他字符串(其周围有 XML 编码)之间的字符串以及要从包含 2 行的字段中提取的字符串。

我想要在

7,5
attr4">
之间添加数字
</attr>
(然后在第二行中添加数字
3,5

Line 1: <attr name="attr1; attr2; attr3; attr4">7,5</attr>
Line 2: <attr name="attr5; attr6; attr7; attr8">3,5</attr>

attr4 可以包含圆括号。例如。 '属性(m)'

我不太明白正则表达式的语法。所以我也尝试了 substr 和 with 子句,但它也产生 NULL。

我尝试过(例如):

SELECT substr( match, 2, length(match)-2 ) from (
SELECT regexp_substr('<attr name="attr1; attr2; attr3; attr4">7,5</attr>
<attr name="attr5; attr6; attr7; attr8">3,5</attr>', '\:(.+)\~') match FROM dual);

预期结果:7,5。

它看起来很简单,但几个小时后,我尝试了其他帖子中的解决方案,但我还没有得到任何结果。

有什么想法吗?

xml oracle line substr regexp-substr
1个回答
0
投票

不要使用正则表达式来解析XML。使用正确的 XML 解析器。

您只有 XML 片段,需要将其包装在单个父节点中,但完成后,您可以使用:

SELECT *
FROM   XMLTABLE(
         '/root/attr'
         PASSING XMLTYPE(
           '<root>' || '<attr name="attr1; attr2; attr3; attr4">7,5</attr>
<attr name="attr5; attr6; attr7; attr8">3,5</attr>' || '</root>'
         )
         COLUMNS
           names VARCHAR2(4000) PATH './@name',
           value VARCHAR2(4000) PATH './text()'
       )

哪个输出:

姓名 价值
属性1;属性2;属性3;属性4 7,5
属性5;属性6;属性7;属性8 3,5

注意:如果您只对

value
列感兴趣,则无需提取
name
属性。

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.