用正则表达式替换xml标记

时间:2010-04-16 19:34:25

标签: c# xml regex

如何用定义的字符串替换xml文件中的某个部分?

<tag1></tag2>
<tag2></tag2>
...etc
<soundcard num=0> 
<name>test123</name>
</soundcard>
<soundcard num=1> 
<name>test123</name>
</soundcard>
<soundcard num=2> 
<name>test123</name>
</soundcard>
<tag5></tag5>

替换结果如下所示的所有声卡部分:

<tag1></tag2>
<tag2></tag2>
...etc
{0}
<tag5></tag5>

我正在使用c#.net 3.5而且我正在使用正则表达式解决方案

3 个答案:

答案 0 :(得分:3)

如果 是正则表达式,那么您的XML文件格式正确,并且知道(例如,来自DTD)<soundcard>标签不能嵌套,那么你可以使用

(<soundcard.*?</soundcard>\s*)+

并将所有内容替换为{0}

在C#中:

resultString = Regex.Replace(subjectString, @"(<soundcard.*?</soundcard>\s*)+", "{0}", RegexOptions.Singleline);

对于一次性问题的快速修复,我认为没问题。将regex视为处理XML的正确工具是不行的。

答案 1 :(得分:2)

我个人会将Linq用于XML并删除实体并将其替换为文本节点。

2010年4月16日下午4:40 MST

这是Linq to XML的一个例子,我有点生疏,但它至少应该让你知道如何做到这一点。

XElement root = XElement.Load("myxml.xml");

var soundcards = select el from root.Elements() where el.Name == "soundcard" select el;
var prev_node = soundcards.First().PreviousNode;

// Remove Nodes
foreach(XElement card in soundcards)
    card.Remove();

// Build your content here into a variable called newChild

prev_node.AddAfterSelf(newChild);

答案 2 :(得分:1)

我的建议是使用XSLT转换来替换你想用已知标签替换的标签,比如说,然后是String.Replace('','{0}');.

我回应约翰内斯所说的,不要试图建立RE来做到这一点。随着XML变得越来越复杂,错误率将会增加。