Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从另一个XDocument中删除XElement_C#_Xml_Linq_Linq To Xml - Fatal编程技术网

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次。