我正在寻找 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。使用正确的 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
属性。