为什么XML属性在.NET中没有“父”?

时间:2012-03-08 15:20:44

标签: .net xml

因此,我正在编写一个简单的函数来从XML文档中删除XML节点。据我所知,实现这一目标的最简单方法是:

  1. 获取将要删除的节点(ChildNode
  2. 的引用
  3. 使用ChildNode.ParentNode属性(ParentNode
  4. 获取对节点的父级的引用
  5. 调用ParentNode.RemoveChild(ChildNode)方法
  6. 现在,如果子节点是XmlElement,这可以很好用,但是如果子节点是XML 属性怎么办?根据{{​​1}}的{​​{3}},该属性将返回XmlNode.ParentNode,因为&#34; [属性]没有父母。&#34; < / p>

    属性肯定有#34;父母,&#34;他们不是吗?必须将属性分配给XML元素,因此在我看来,XML元素将是属性的父元素。

    有人可以澄清我的误解,或澄清为什么.NET Framework不会将属性视为拥有父母吗?

2 个答案:

答案 0 :(得分:10)

您可以使用XmlAttribute.OwnerElement获取属性的所有者。

您的程序必须修改为以下内容:

  1. 获取将要删除的节点的引用(ChildNode)。

  2. 如果节点类型XmlAttribute向下转换为该类型(AttributeNode)并使用AttributeNode.OwnerElement属性({{1})获取对节点父节点的引用})。如果没有,请转到第4步。

  3. 调用ParentNode方法。跳过剩下的步骤。

  4. 使用ParentNode.Attributes.Remove(AttributeNode)属性(ChildNode.ParentNode)获取对节点父级的引用。

  5. 调用ParentNode方法。

  6. 所以基本上你必须给出属性特殊处理,反映它们实际上不是父子层次结构的一部分,而是 - 元素 - 是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元素包含属性吗?这似乎不太可取。