Xml删除Childs但不删除属性

时间:2014-02-08 14:59:40

标签: c# xml nodes

我需要一个可以删除某个特定节点的所有子节点的函数。但只有子节点,而不是属性。 System.XML中有标准功能可以删除所有子项,但它也会删除我拥有的所有属性。

结果我编写了自己的函数,它将xmlDocument,我的父节点(扇区)和bool变量toRemoveAttributes作为参数。在这种情况下,我将所有属性都带到一个XmlAttributeCollection,然后使用RemoveAll函数。

public void RemoveChild(XmlDocument xd, string sectorName, bool removeAttributes)
{
    XmlElement sector;
    if (sectorName == "root")
        sector = xd.DocumentElement;
    else
        sector = (XmlElement)xd.GetElementsByTagName(sectorName)[0];

    XmlAttributeCollection atr = sector.Attributes;            
    sector.RemoveAll();
    if(!removeAttributes)
    {
        for (int i = 0; i < atr.Count; i++)
            sector.SetAttribute(atr[i].Name, atr[i].Value);
    }
}

结果我的属性仍被删除。当我调试我的代码时,我看到在RemoveAll()之后,所有内容都从我的'atr'集合中删除。

1 个答案:

答案 0 :(得分:0)

这里已经提供了答案和解决方案:
How to remove all child nodes of an XmlElement, but keep all attributes?


我只想添加一些关于您具体情况的说明。

Garath提供了一个详细的解释,包括内部调用的内容:

// Removes all specified attributes and children of the current node.
// Default attributes are not removed.
public override void RemoveAll()
{
    base.RemoveAll();
    this.RemoveAllAttributes();
}

由于您的atr变量引用了sector.Attributes,而之前的方法刚刚从sector移除了属性,atr也不再具有属性。所以atr.Count == 0和循环永远不会运行。您可以尝试通过在sector.SetAttribute...上放置一个断点来验证这一点,看看它是否被击中。

请参阅该问题中的other answer以获取可以使用的解决方案。


你可以做一些其他的调用,与RemoveAll有类似的效果而不调用RemoveAllAttributes,但可能会出现意想不到的副作用,所以我会坚持回答另一篇文章。

sector.InnerXml = "";

或者:

sector.IsEmpty = true;