Skip to main content
 首页 » 编程设计

c#之如何使用正则表达式清理 XML 属性

2024年02月01日25kenshinobiy

我想从我的 XML 结构中删除所有属性。我的选择是正则表达式,但如果有更简单的方法,我欢迎提出建议。

为了挑选出一个固定的标签,我使用了以下内容。

String clean = Regex.Replace(filled, ".*?<holder[^>]*?>(.*?)</holder>.*?", "$1"); 

这给了我标签持有者的内容。我现在想保留文本质量,但省略内部标签中的所有属性。我尝试了以下方法。

String plain1 = Regex.Replace(clean, "(<[^>]*?>)(.*?)(</[^>]*?>)", "$1$2$3"); 
String plain2 = Regex.Replace(clean, "(<[a-zA-Z]*?)([^>]*?)(>)", "$1$3"); 

但它返回相同的内容 (plain1) 和没有原始名称的空标签 (plain2)。什么都没有被清理,或者一切都被清理了。我做错了什么?

我注意到改变 start 为 plus,给我的标签只包含名字的第一个字母,所以我很确定下面的方法是正确的,只要我能做到$1 的部分最大。我该怎么做?

String plain3 = Regex.Replace(clean, "(<[a-zA-Z]+?)([^>]*?)(>)", "$1$3"); 

请您参考如下方法:

您需要跳过第一个括号中的问号。

String plain3 = Regex.Replace(clean, "(<[a-zA-Z]+)([^>]*?)(>)", "$1$3"); 

一些观察。

  • 您需要处理结束标记。您现在正在跳过斜杠字符。
Regex.Replace(clean, "(<[/a-zA-Z]+)([^>]*?)(>)", "$1$3"); 
  • 你不需要$2。 $3 也不是。
Regex.Replace(clean, "(<[a-zA-Z]+)[^>]*?>", "$1>"); 
  • 在正则表达式中有更好的方式来表达“只有字母”。
Regex.Replace(clean, @"(<[\w]+)([^>]*?)(>)", "$1$3"); 

所以最后,您可能会得到以下结果。

Regex.Replace(clean, @"(<[/\w]*)[^>]*?>", "$1>");