因此,我正在编写一个简单的函数来从XML文档中删除XML节点。据我所知,实现这一目标的最简单方法是:
ChildNode
)ChildNode.ParentNode
属性(ParentNode
)ParentNode.RemoveChild(ChildNode)
方法现在,如果子节点是XmlElement
,这可以很好用,但是如果子节点是XML 属性怎么办?根据{{1}}的{{3}},该属性将返回XmlNode.ParentNode
,因为&#34; [属性]没有父母。&#34; < / p>
属性肯定有#34;父母,&#34;他们不是吗?必须将属性分配给XML元素,因此在我看来,XML元素将是属性的父元素。
有人可以澄清我的误解,或澄清为什么.NET Framework不会将属性视为拥有父母吗?
答案 0 :(得分:10)
您可以使用XmlAttribute.OwnerElement
获取属性的所有者。
您的程序必须修改为以下内容:
获取将要删除的节点的引用(ChildNode
)。
如果节点类型XmlAttribute
向下转换为该类型(AttributeNode
)并使用AttributeNode.OwnerElement
属性({{1})获取对节点父节点的引用})。如果没有,请转到第4步。
调用ParentNode
方法。跳过剩下的步骤。
使用ParentNode.Attributes.Remove(AttributeNode)
属性(ChildNode.ParentNode
)获取对节点父级的引用。
调用ParentNode
方法。
所以基本上你必须给出属性特殊处理,反映它们实际上不是父子层次结构的一部分,而是 - 元素 - 是XML元素的一部分。
答案 1 :(得分:3)
一个很好的问题,答案在于规范,而不是微软(一次,有些人可能会说......)。
Over at the W3C,我们可以找到the specification,它可以推翻我们任何一个人可能觉得直觉明显的东西。在其中,我发现父一词一次,in this context:
[定义:因此,对于每个非根元素C in 在文档中,文档中还有另一个元素P,即C 是P的内容,但不在任何其他元素的内容中 在P的内容中,P被称为C的父,和 C作为P的孩子。]
请注意,此处“element”仅指实际的元素; “内容”仅指儿童元素。 XmlNode
概念是抽象( not 出现在规范中),它是库的一部分,而不是标准。
我认为MS 可以让属性ParentNode
的实现返回拥有元素,但是你想要ChildNodes
元素包含属性吗?这似乎不太可取。