从另一个XDocument中删除XElement

时间:2013-06-06 11:46:01

标签: c# xml linq linq-to-xml

我需要从XElement删除XDocument

问题是我不能只使用.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行。

2 个答案:

答案 0 :(得分:3)

更好的方法是使用现有的基于名称的方法:

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

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

但这仍然只是使用“元素名称和父名称”作为识别元素的一种方式。你还有其他能更可靠地识别元素的东西吗?某种属性?我假设你真的知道你会发现什么样的元素。

  

我的XDocument有1000行。

然后它应该是快速眨眼的。你真的有迹象表明这会导致性能问题吗?

要考虑的另一件事:

  

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

你有什么理由不避免复制节点开始?

答案 1 :(得分:1)

正如您所说的那样,如果您只是依赖于Parent.Name.LocalName,那么当父母的姓名相似时,您最终可能会删除不正确的子节点。

如果在删除子节点之前验证重复的父节点,则可以解决此问题。

您应该能够通过将节点加载到数组/列表来实现准确性。然后,您将能够找到确切父节点的位置。但我担心它不会改善表现。

例如,您有3个带有'XZY'的父节点。 用户选择2父节点。所以你的父索引将是1(假设索引从0开始) 因此,您应该只删除父索引1下的子项。

希望这有帮助。