使用Regex用cdata包装xml元素值

时间:2015-06-09 12:57:32

标签: regex xml search replace

我必须编辑一个构建xml字符串的存储过程,以便所有元素值都包装在cdata中。一些值已经包装在cdata中,所以我需要忽略它们。

我认为这是学习一些正则表达式的好尝试

From: <element>~DATA_04</element> 
to:   <element><![CDATA[~DATA_04]]></element>

我有什么选择如何做到这一点?我可以做简单的正则表达式,这是更先进的。

注意:<element>是通用的,仅用于说明目的,实际上,它可能是任何内容并且未知。

示例文字:

    declare @sql   nvarchar(max) =
'    <data>
    <header></header>
    <docInfo>Blah</docInfo>
    <someelement>~DATA_04</someelement>
    <anotherelement><![CDATA[~DATA_05]]></anotherelement>
</data>
'

使用样本xml,正则表达式需要找到一些元素,并像<someelement><![CDATA[~DATA_04]]></someelement>一样添加cdata,并保留其他元素。

请记住,我没有编写这个可怕的sql代码,我只需编辑它。

2 个答案:

答案 0 :(得分:0)

这是c#:

string text = Regex.Replace( inputString, @"<element>~(.+)</element>", "<element>![CDATA[~$1]]</element>" , RegexOptions.None );

发现是:

<element>~(.+)</element>

替换是:

<element>![CDATA[~$1]]</element>

我假设元素标签内部的开头有一个〜。

如果这是一个问题,您还需要留意空白......

您可能想要添加一些

\s*

任何空白字符,零个或多个匹配

答案 1 :(得分:0)

尝试使用(<[^>]+>)(\~data_([^<]+))(<[^>]+>)

并替换\1<![CDATA[\2]]>\4

这会给你:<element><![CDATA[~DATA_04]]></element>, 元素可以是其他任何东西。查看http://localhost/test/test.php

祝你好运