我想将LINQ复制到XML XElement。我要执行此操作的原因是文档中有一些节点要创建(在同一文档中)修改后的副本。我看不到执行此操作的方法。
我可以将元素转换为XML字符串,然后重新解析,但我想知道是否有更好的方法。
我想将LINQ复制到XML XElement。我要执行此操作的原因是文档中有一些节点要创建(在同一文档中)修改后的副本。我看不到执行此操作的方法。
我可以将元素转换为XML字符串,然后重新解析,但我想知道是否有更好的方法。
Answers:
无需修复。XElement的构造函数之一使用另一个XElement并对其进行深层复制:
XElement original = new XElement("original");
XElement deepCopy = new XElement(original);
这里有几个单元测试来演示:
[TestMethod]
public void XElementShallowCopyShouldOnlyCopyReference()
{
XElement original = new XElement("original");
XElement shallowCopy = original;
shallowCopy.Name = "copy";
Assert.AreEqual("copy", original.Name);
}
[TestMethod]
public void ShouldGetXElementDeepCopyUsingConstructorArgument()
{
XElement original = new XElement("original");
XElement deepCopy = new XElement(original);
deepCopy.Name = "copy";
Assert.AreEqual("original", original.Name);
Assert.AreEqual("copy", deepCopy.Name);
}
XElement
Copy构造函数的文档。还有一个XDocument
复制构造函数。对我们来说幸运的是,LINQ to XML使得此操作变得容易。。。一般来说,深度复制(或克隆)可能不是那么简单。
DeepEquals
显示了两个节点现在不同。
从C#3.0直接提升:
将节点或属性添加到元素时(无论是通过函数构造还是通过Add方法),节点或属性的Parent属性都将设置为该元素。一个节点只能有一个父元素:如果将一个已父节点添加到第二个父节点,则该节点将自动进行深度克隆。在以下示例中,每个客户都有一个单独的地址副本:
var address = new XElement ("address",
new XElement ("street", "Lawley St"),
new XElement ("town", "North Beach")
);
var customer1 = new XElement ("customer1", address);
var customer2 = new XElement ("customer2", address);
customer1.Element ("address").Element ("street").Value = "Another St";
Console.WriteLine (
customer2.Element ("address").Element ("street").Value); // Lawley St
这种自动复制使X-DOM对象实例化免受副作用的影响-这是功能编程的另一个标志。
这应该工作:
var copy = new XElement(original.Name, original.Attributes(),
original.Elements() );
new XElement(original)
。