删除具有给定名称的所有XML属性

我正在编辑一系列XML文件,我需要删除名为“foo”的所有属性。 此属性出现在多种元素中。 XML的示例代码段可能是:

   

Header

. . etc.

我使用的最佳解决方案是使用Regex:

 Regex regex = new Regex("foo=\"" + ".*?" + "\"", RegexOptions.Singleline); content = regex.Replace(content, ""); 

我知道内置的XML解析器可以提供帮助,但理想情况下我想要进行简单的XML替换/删除,而不必处理整个XML解析器的包袱。 在这种情况下,Regex是最好的解决方案吗?

编辑

在对XmlDocument类进行一些研究之后,我提出了一个可能的解决方案(删除存储在数组“ids”中的多个属性类型):

 private void removeAttributesbyName(string[] ids) { XmlDocument doc = new XmlDocument(); doc.Load(path); XmlNodeList xnlNodes = doc.GetElementsByTagName("*"); foreach (XmlElement el in xnlNodes) { for (int i = 0; i <= ids.Length - 1; i++) { if (el.HasAttribute(ids[i])) { el.RemoveAttribute(ids[i]); } if (el.HasChildNodes) { foreach (XmlNode child in el.ChildNodes) { if (child is XmlElement && (child as XmlElement).HasAttribute(ids[i])) { (child as XmlElement).RemoveAttribute(ids[i]); } } } } } } 

我不知道这是否尽可能高效,但我已经测试了它,似乎工作正常。

不要使用正则表达式进行XML操作。 您可以使用Linq to XML:

 XDocument xdoc = XDocument.Parse(xml); foreach (var node in xdoc.Descendants().Where(e => e.Attribute("foo")!=null)) { node.Attribute("foo").Remove(); } string result = xdoc.ToString(); 

在这种情况下,Regex是最好的解决方案吗?

没有。

您将希望在对象级别使用适用于XML的东西(例如,作为XmlElement ),而不是在string级别。

我使用以下命令删除命名空间。 这也可以用于从其他节点中删除属性。

  FileStream fs = new FileStream(filePath, FileMode.Open); StreamReader sr = new StreamReader(fs); DataSet ds = new DataSet(); ds.ReadXml(sr); ds.Namespace = ""; string outXML = ds.GetXml(); ds.Dispose(); sr.Dispose(); fs.Dispose();