【问题标题】:Replace xml tag with regex用正则表达式替换 xml 标签
【发布时间】:2010-04-16 19:34:24
【问题描述】:

如何用定义的字符串替换 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,我想使用正则表达式解决方案

【问题讨论】:

  • 使用正则表达式来解析、修改或以其他方式处理 XML 和其他非正则语言(如 HTML、JSON、YAML 等)。此处正确的解决方案是使用 XML API 来根据需要解析和更改文档树。
  • @Johannes:你的意思是不要不要。
  • 令人惊讶的是,有多少人尝试使用正则表达式解析 XML/HTML...
  • @SLaks:啊,是的;不过,现在改正错字为时已晚。

标签: c# xml regex


【解决方案1】:

如果它必须是一个正则表达式,那么您的 XML 文件格式正确,并且您知道(例如,从 DTD)&lt;soundcard&gt; 标签可以' t被嵌套,那么你可以使用

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

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

在 C# 中:

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

对于一次性问题的快速解决方案,我认为没问题。一般来说,将正则表达式视为处理 XML 的适当工具是不对的。

【讨论】:

    【解决方案2】:

    我个人会使用 Linq to 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);
    

    【讨论】:

      【解决方案3】:

      我的建议是使用 XSLT 转换将要替换的标签替换为已知标签,例如 ,然后是 String.Replace('', '{0}');。

      我赞同 Johannes 所说的,不要试图构建 RE 来做到这一点。随着您的 XML 变得越来越复杂,您的错误率也会增加。

      【讨论】:

        猜你喜欢
        • 2018-06-19
        • 2012-07-06
        • 2012-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多