C#删除属性XML

时间:2018-06-07 19:52:38

标签: c# xml

我正在尝试从XML文件中删除一些指定的属性示例代码如下。 string [] szNodeList是数组列表,因此节点包含字符串数组中的名称将被删除并再次保存

任何帮助将不胜感激。

        var doc = new System.Xml.XmlDocument();
        doc.Load("attrs.xml");
        var root = doc.DocumentElement;
        string[] szNodeList = new string[]  { "titleTextColor"
        ,"isLightTheme"
        ,"showText"
                    };
        foreach (System.Xml.XmlElement  child in root )
        {
            foreach (string sz in szNodeList)
            {
                root.RemoveAttribute(sz);
                //if (child.Attributes[sz] != null)
                //{
                //    child.Attributes.Remove(child.Attributes[sz]);
                //}
            }
        }

        doc.Save("build.xml");

    XML CODE

  <?xml version="1.0" encoding="utf-8"?>
  <resources>
    <attr name="cropImageStyle" format="reference" />
    <attr name="drawerArrowStyle" format="reference" />
    <attr name="height" format="dimension" />
    <attr name="isLightTheme" format="boolean" />
    <attr name="title" format="string" />
    <attr name="navigationMode">
      <enum name="listMode" value="1" />
      <enum name="normal" value="0" />
      <enum name="tabMode" value="2" />
    </attr>

  </resources>

但是保存为原始文件而没有更改我移除的东西不起作用。

2 个答案:

答案 0 :(得分:2)

试试这个:

doc
    // select all `resources/attr` node
    .SelectNodes("resources/attr")
    .Cast<XmlNode>()
    // that contains the `name` attribute whose value is in `szNodeList`
    .Where(x => !string.IsNullOrEmpty(x.Attributes["name"]?.Value) && szNodeList.Contains(x.Attributes["name"].Value))
    .ToList()
    // and, remove them from their parent
    .ForEach(x => x.ParentNode.RemoveChild(x));

答案 1 :(得分:1)

这里的问题之一是术语。您并没有尝试删除属性,正如我所理解的那样 - 您正在尝试根据name属性的值删除整个元素

如果您可以使用LINQ to XML,我会这样做。它通常使得使用XML变得更容易。这是一个完整的程序,可以做你想做的事情:

using System;
using System.Linq;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        var namesToRemove = new[]
        { 
            "titleTextColor",
            "isLightTheme",
            "showText"
        };
        XDocument doc = XDocument.Load("test.xml");
        // For all the elements directly under the document root...
        doc.Root.Elements()
            // Where the array contains the value of the "name" attribute...
            .Where(x => namesToRemove.Contains((string) x.Attribute("name")))
            // Remove them from the document
            .Remove();
        doc.Save("output.xml");
    }
}

输出:

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <attr name="cropImageStyle" format="reference" />
  <attr name="drawerArrowStyle" format="reference" />
  <attr name="height" format="dimension" />
  <attr name="title" format="string" />
  <attr name="navigationMode">
    <enum name="listMode" value="1" />
    <enum name="normal" value="0" />
    <enum name="tabMode" value="2" />
  </attr>
</resources>