我需要一个可以删除某个特定节点的所有子节点的函数。但只有子节点,而不是属性。 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'集合中删除。
答案 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;