如何在XDocument中获取替换的节点

时间:2015-05-06 13:47:25

标签: c# xml

我正在替换XDocument中的节点,但是在替换之后我找不到一种简单的方法来访问它们。在下面的代码中,我可以将“nodeC”替换为“newnode”,但如果我尝试对新节点执行某些操作,则不会影响文档。如何获得实际替换的节点?

var document = XDocument.Parse("<nodeA><nodeB/><nodeC/><nodeD/></nodeA>");
var oldNode = document.Descendants("nodeC").First();
var newNode = XElement.Parse("<root><newnode/></root>").Element("newnode");
oldNode.ReplaceWith(newNode);
newNode.AddBeforeSelf(new XComment("comment")); // the comment is not added

P.S。之后我可以从文档中选择它们,但我更喜欢在API中使用能够让我获得替换元素的东西。

1 个答案:

答案 0 :(得分:1)

问题在于,当您致电Replace时,newNode已经有了父母 - 所以它已被克隆。如果在调用ReplaceWith之前将其从父中删除,则会直接添加该元素,而不是添加副本:

newNode.Remove();
oldNode.ReplaceWith(newNode);

...现在您将在文档中看到评论。

另一个选项(不影响节点的“源”文档)是自己手动克隆节点:

newNode = new XElement(newNode);
oldNode.ReplaceWith(newNode);

同样,newNode现在在您调用ReplaceWith时没有父级,因此不需要再次克隆,而是直接插入。