【问题标题】:Remove all XML Attributes with a Given Name删除所有具有给定名称的 XML 属性
【发布时间】:2013-07-27 06:38:00
【问题描述】:

我正在编辑一系列 XML 文件,我需要删除所有名为“foo”的属性。此属性出现在不止一种类型的元素中。 XML 中的一个示例 sn-p 可能是:

<bodymatter id="######">
  <level1 id="######">
    <pagenum page="#####" id="######" foo="######" />
    <h1 id="#####" foo="#####">Header</h1>
    <imggroup id="#######">
               .
               .
              etc.

我使用正则表达式的最佳解决方案:

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]);
                    }
                }
            }
        }
    }
}

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

【问题讨论】:

标签: c# xml replace


【解决方案1】:

不要使用正则表达式进行 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 解析器的所有方法库。但是,现在我正在研究 XmlDocument 类,并且我也可能会利用您在此处拥有的内容。谢谢!
  • 只是为了帮助像我这样学习缓慢的人;我收到错误 CS1061,说我缺少参考。可以肯定的是,您需要使用“System.Linq.Xml”和“System.Linq”的引用才能使上述代码正常工作。
【解决方案2】:

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

没有。

您需要在对象级别(例如XmlElement)而不是string 级别使用适用于 XML 的东西。

【讨论】:

    【解决方案3】:

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

           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();
    

    【讨论】:

      猜你喜欢
      • 2018-03-20
      • 2012-06-20
      • 2012-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 2020-05-27
      • 2016-02-18
      相关资源
      最近更新 更多