Diferencias entre adjuntar y clonar
Cuando se asocian objetos XNode (incluyendo el objeto XElement) o XAttribute a un árbol nuevo, si el contenido nuevo no tiene un elemento primario, los objetos simplemente se adjuntan al árbol XML. Si el nuevo contenido ya tiene un elemento primario y forma parte de otro árbol XML, se clona el nuevo contenido. Es nuevo contenido clonado se adjunta al árbol XML.
Ejemplo
El siguiente código demuestra qué ocurre si agrega un elemento que tiene elemento primario a un árbol y qué ocurre si agrega un elemento que no tenga elemento primario a un árbol.
// Create a tree with a child element.
XElement xmlTree1 = new XElement("Root",
new XElement("Child1", 1)
);
// Create an element that is not parented.
XElement child2 = new XElement("Child2", 2);
// Create a tree and add Child1 and Child2 to it.
XElement xmlTree2 = new XElement("Root",
xmlTree1.Element("Child1"),
child2
);
// Compare Child1 identity.
Console.WriteLine("Child1 was {0}",
xmlTree1.Element("Child1") == xmlTree2.Element("Child1") ?
"attached" : "cloned");
// Compare Child2 identity.
Console.WriteLine("Child2 was {0}",
child2 == xmlTree2.Element("Child2") ?
"attached" : "cloned");
' Create a tree with a child element.
Dim xmlTree1 As XElement = _
<Root>
<Child1>1</Child1>
</Root>
' Create an element that is not parented.
Dim child2 As XElement = <Child2>2</Child2>
' Create a tree and add Child1 and Child2 to it.
Dim xmlTree2 As XElement = _
<Root>
<%= xmlTree1.<Child1>(0) %>
<%= child2 %>
</Root>
' Compare Child1 identity.
Console.WriteLine("Child1 was {0}", _
IIf(xmlTree1.Element("Child1") Is xmlTree2.Element("Child1"), _
"attached", "cloned"))
' Compare Child2 identity.
Console.WriteLine("Child2 was {0}", _
IIf(child2 Is xmlTree2.Element("Child2"), _
"attached", "cloned"))
Este ejemplo genera el siguiente resultado:
Child1 was cloned
Child2 was attached