I want to make a deep copy of a LINQ to XML XElement. The reason I want to do this is there are some nodes in the document that I want to create modified copies of (in the same document). I don't see a method to do this.
I could convert the element to an XML string and then reparse it, but I'm wondering if there's a better way.
There is no need to reparse. One of the constructors of XElement takes another XElement and makes a deep copy of it:
XElement original = new XElement("original"); XElement deepCopy = new XElement(original);
Here are a couple of unit tests to demonstrate:
[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); }
It looks like the ToString and reparse method is the best way. Here is the code:
XElement copy = XElement.Parse(original.ToString());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With