从另一个XDocument中删除一个XElement



我需要从XDocument中移除XElement

问题是我不能只使用.Remove(),因为我的XDocumentXElement不一样。

一个非常重要的事实是性能。

场景:我有一个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下的子索引。

最新更新