5

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

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

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

4

3 回答 3

9

不要将正则表达式用于 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();
于 2013-07-26T23:15:38.370 回答
2

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

不。

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

于 2013-07-26T20:47:20.567 回答
0

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

       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();
于 2016-03-15T13:35:37.037 回答