我需要从XDocument
中移除XElement
问题是我不能只使用.Remove()
,因为我的XDocument
与XElement
不一样。
一个非常重要的事实是性能。
场景:我有一个XDocument docSource
,我复制到XDocument doc
。我选择了docSource
的一个节点,并想在我的doc
中删除这个节点。
到目前为止,我正在使用这个解决方案(这也可能删除一些错误的节点,如果他们得到相同的父名,但这并不重要到目前为止):
private static XNode actualNode;
private static void RemoveNode(XDocument doc)
{
doc.Root.Descendants(((XElement)actualNode).Name.LocalName)
.Where(e => actualNode.Parent.Name.LocalName.Equals(e.Parent.Name.LocalName))
.Remove();
}
有更好的方法吗?特别是更快的方法?我的XDocument大概有1000行
一个更好的基于名称的方法是:
doc.Root.Descendants(actualNode.Parent.Name)
.Elements(actualNode.Name)
.Remove();
除了其他之外,这更简单——而且不只是使用本地名称。(如果元素实际上在不同的名称空间中,您应该单独考虑IMO)
但是这仍然只是使用"元素名和父元素名"作为标识元素的一种方式。你还有什么东西可以更可靠地识别这种元素吗?某种属性?我假设你已经知道你会找到什么样的元素了。
我的XDocument大概有1000行。
那应该是一眨眼的事。您是否有任何迹象表明这会导致性能问题?
另一件要考虑的事情:
场景:我有一个xdocumentdocsource,我把它复制到xdocumentdoc。我选择了docSource的一个节点,并想在我的文档中删除这个节点。
有什么理由不直接避免复制开始的节点吗?
正如您所说的,如果您只是依赖于Parent.Name.LocalName,那么当存在具有相似名称的parent时,您可能最终会删除不正确的子节点。
如果您在删除子节点之前验证重复的父节点,您将能够克服此问题。
您应该能够通过将节点加载到数组/列表中来实现准确性。然后,您将能够找到父节点的确切位置。但是我担心它不会提高性能。
例如,您有3个带有'XZY'的父节点。用户选择父节点2。那么你的父索引将是1(假设索引从0开始)所以你应该只删除父索引1下的子索引。