2

我需要XElementXDocument.

问题是我不能只使用 ,.Remove()因为 myXDocumentXElement.

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

场景:我有一个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 行。

4

2 回答 2

3

一个更好的方法来做现有的基于名称的方法是:

doc.Root.Descendants(actualNode.Parent.Name)
        .Elements(actualNode.Name)
        .Remove();

除此之外,这更简单 - 并且不仅仅使用本地名称。(如果元素实际上位于不同的命名空间中,则应单独考虑 IMO。)

但这仍然只是使用“元素名称和父名称”作为识别元素的一种方式。你还有什么可以更可靠地识别元素吗?某种属性?我假设你实际上对你会找到什么样的元素有所了解。

我的 XDocument 有 1000 行。

那么无论如何它应该是一眨眼的功夫。您实际上是否有任何迹象表明这会导致性能问题?

另一件需要考虑的事情:

场景:我有一个 XDocument docSource,我将它复制到 XDocument doc。我选择了一个 docSource 的节点,并想在我的文档中删除这个节点。

您是否有任何理由不只是避免复制节点开始?

于 2013-06-06T11:54:07.593 回答
1

正如您所说的那样,如果您仅依赖 Parent.Name.LocalName ,那么当存在具有相似名称的父节点时,您最终可能会删除不正确的子节点。

如果您在删除子节点之前验证重复的父节点,您将能够克服这个问题。

您应该能够通过将节点加载到数组/列表来实现准确性。然后您将能够找到确切的父节点的位置。但恐怕它不会提高性能。

例如,您有 3 个带有“XZY”的父节点。用户选择 2 个父节点。所以你的父索引将为1(假设索引以0开头)所以你应该只删除父索引1下的孩子。

希望这可以帮助。

于 2013-06-06T12:13:07.163 回答