【问题标题】:Using Regex to wrap xml element value with cdata使用正则表达式用 cdata 包装 xml 元素值
【发布时间】:2015-08-24 07:25:37
【问题描述】:

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

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

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

对于如何做到这一点,我有哪些选择?我可以做简单的正则表达式,这更高级。

注意:&lt;element&gt; 是通用的,用于说明目的,实际上,它可以是任何东西并且是未知的。

示例文本:

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

使用示例 xml,正则表达式需要找到一些元素并将 cdata 添加到其中,如 &lt;someelement&gt;&lt;![CDATA[~DATA_04]]&gt;&lt;/someelement&gt; 并保留其他元素。

请记住,这可怕的 sql 代码不是我写的,我只需要编辑它。

【问题讨论】:

标签: regex xml search replace


【解决方案1】:

这是c#:

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

发现是:

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

替换为:

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

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

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

你可能想添加一些

\s*

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

【讨论】:

  • 感谢您的快速回复。以上将不起作用,因为标签是未知的。在这种情况下使用正则表达式的原因是我需要编辑的存储过程实际上有数千个元素要编辑,我可能需要编辑多个文件,所以我需要快速和可重复的东西。
【解决方案2】:

试试(&lt;[^&gt;]+&gt;)(\~data_([^&lt;]+))(&lt;[^&gt;]+&gt;)

替换为\1&lt;![CDATA[\2]]&gt;\4

这会给你:&lt;element&gt;&lt;![CDATA[~DATA_04]]&gt;&lt;/element&gt;, 其中元素可以是其他任何东西。检查DEMO

祝你好运

【讨论】:

  • 这很接近但不是我需要的。它只需要选择和更改具有 ~data_## 而没有 cdata 的字符串
  • 请再次检查,因错误理解要求而更正:)
猜你喜欢
  • 2017-11-07
  • 2010-11-23
  • 1970-01-01
  • 2010-10-01
  • 2018-11-24
  • 2013-01-09
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多