C# 从另一个XDocument中删除XElement
我需要从C# 从另一个XDocument中删除XElement,c#,xml,linq,linq-to-xml,C#,Xml,Linq,Linq To Xml,我需要从XDocument中删除XElement 问题是我不能只使用.Remove(),因为我的XDocument与XElement不同 一个非常重要的事实是性能 场景:我有一个xdocumentdocsource,我将其复制到xdocumentdoc。我选择了docSource的一个节点,并希望在我的doc中删除该节点 到目前为止,我正在使用这种变通方法(如果它们具有相同的父名称,也可能会删除一些错误的节点,但到目前为止这并不重要): 有更好的方法吗?尤其是更快的方式? 我的XDocument
XDocument
中删除XElement
问题是我不能只使用.Remove()
,因为我的XDocument
与XElement
不同
一个非常重要的事实是性能
场景:我有一个xdocumentdocsource
,我将其复制到xdocumentdoc
。我选择了docSource
的一个节点,并希望在我的doc
中删除该节点
到目前为止,我正在使用这种变通方法(如果它们具有相同的父名称,也可能会删除一些错误的节点,但到目前为止这并不重要):
有更好的方法吗?尤其是更快的方式?
我的XDocument大约有1000行。对于现有的基于名称的方法,更好的方法是:
doc.Root.Descendants(actualNode.Parent.Name)
.Elements(actualNode.Name)
.Remove();
除此之外,这更简单,而且不只是使用本地名称。(如果元素实际上在不同的名称空间中,您应该分别考虑这一点。)
但这仍然只是使用“元素名和父名称”作为标识元素的一种方式。您还有其他更可靠地识别元件的方法吗?某种属性?我假设你确实知道你会找到什么样的元素
我的XDocument大约有1000行
无论如何,眨眼之间就应该很快了。您是否确实有任何迹象表明这会导致性能问题
另一件需要考虑的事情是:
场景:我有一个XDocument docSource,并将其复制到XDocument doc。我选择了docSource的一个节点,并希望在我的文档中删除该节点
有什么理由不只是避免复制节点来开始吗?那么,使用现有的基于名称的方法的更好方法是:
doc.Root.Descendants(actualNode.Parent.Name)
.Elements(actualNode.Name)
.Remove();
除此之外,这更简单,而且不只是使用本地名称。(如果元素实际上在不同的名称空间中,您应该分别考虑这一点。)
但这仍然只是使用“元素名和父名称”作为标识元素的一种方式。您还有其他更可靠地识别元件的方法吗?某种属性?我假设你确实知道你会找到什么样的元素
我的XDocument大约有1000行
无论如何,眨眼之间就应该很快了。您是否确实有任何迹象表明这会导致性能问题
另一件需要考虑的事情是:
场景:我有一个XDocument docSource,并将其复制到XDocument doc。我选择了docSource的一个节点,并希望在我的文档中删除该节点
是否有任何理由不只是避免从复制节点开始?正如您所说的,如果您仅仅依赖Parent.Name.LocalName,那么当存在具有类似名称的父节点时,您可能会删除不正确的子节点 如果在删除子节点之前验证重复的父节点,则可以解决此问题 您应该能够通过将节点加载到数组/列表中来实现准确性。然后,您将能够找到确切的父节点的位置。但我担心这不会提高性能 例如,您有3个带有“XZY”的父节点。 用户选择2个父节点。因此,父索引将为1(假设索引以0开头) 因此,您应该只删除父索引1下的子项
希望这能有所帮助。正如您所说的,如果您仅仅依赖Parent.Name.LocalName,那么当存在具有类似名称的父节点时,您可能会删除不正确的子节点 如果在删除子节点之前验证重复的父节点,则可以解决此问题 您应该能够通过将节点加载到数组/列表中来实现准确性。然后,您将能够找到确切的父节点的位置。但我担心这不会提高性能 例如,您有3个带有“XZY”的父节点。 用户选择2个父节点。因此,父索引将为1(假设索引以0开头) 因此,您应该只删除父索引1下的子项
希望这能有所帮助。性能问题:是的,如果我不使用这种单一方法,我的性能将从700毫秒运行到200毫秒,因此这一行消耗了巨大的性能。@WhileTrueSleep:如果真的只有1000行,这似乎有点奇怪。这肯定不是JIT编译等等?我真的不希望您当前的代码会导致问题,尽管我给出的代码可能会更好地执行。您是对的,显示的代码不是问题所在。递归中出现了一个错误,调用了该方法100.000次。性能问题:是的,如果我不使用这个方法,我的性能将从700毫秒运行到200毫秒,因此这一行消耗了巨大的性能。@WhileTrueSleep:如果真的只有1000行,这似乎有点奇怪。这肯定不是JIT编译等等?我真的不希望您当前的代码会导致问题,尽管我给出的代码可能会更好地执行。您是对的,显示的代码不是问题所在。递归中有一个错误,调用了该方法大约100.000次。