LINQ to XML clonage
Question
Quelqu'un peut-il expliquer pourquoi l'adresse d'origine noeud change de rue XElement? Il ressemble à Customer1 contient une référence à l'adresse XElement mais client2 et customer3 ont pris des copies.
Pourquoi le changement d'adresse d'origine? (Exemple LINQPad)
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);
var customer3 = new XElement ("customer3", address);
customer1.Element ("address").Element ("street").Value = "Another St";
Console.WriteLine (customer2.Element ("address").Element ("street").Value);
Console.WriteLine ();
address.Dump();
Console.WriteLine ();
customer1.Dump();
Console.WriteLine ();
customer2.Dump();
Console.WriteLine ();
customer3.Dump();
SORTIE
Lawley St
<address>
<street>Another St</street>
<town>North Beach</town>
</address>
<customer1>
<address>
<street>Another St</street>
<town>North Beach</town>
</address>
</customer1>
<customer2>
<address>
<street>Lawley St</street>
<town>North Beach</town>
</address>
</customer2>
<customer3>
<address>
<street>Lawley St</street>
<town>North Beach</town>
</address>
</customer3>
La solution
Le même XElement ne peut pas être dans plusieurs arbres. Vous pouvez certainement avoir plusieurs références au même XElement dans un arbre particulier, mais même XElement ne peut pas être dans les arbres multiples .
Pour customer1
, vous avez vraiment et vraiment ajouté que address
XElement. Au moment où vous « ajouté » à customer2
, le XElement de address1
réelle ne pouvait pas vraiment être ajouté, car il est déjà un nœud dans un autre XElement. Comme il ne pouvait pas ajouter le address
d'origine comme un nœud, le constructeur XElement place un clone de ce XElement dans customer2
et customer3
. Vous avez maintenant trois XElements « adresse » équivalent.
Autres conseils
De la question:
Il ressemble à Customer1 est titulaire d'un référence à la XElement d'adresse, mais client2 et customer3 ont pris des copies.
Oui, c'est exactement ce qui se passe. De docs pour le contenu XElement :
Lors de l'ajout XNode ou XAttribute objets, si le nouveau contenu n'a pas parent, les objets sont tout simplement attaché à l'arbre XML. Si la nouvelle le contenu est déjà parented et partie d'un autre arbre XML, le nouveau le contenu est cloné, et le nouveau contenu clonée est attaché au XML arbre.
Dans le premier cas, address
n'a pas de parent de sorte qu'il est attaché directement. Par la suite, il Finalité un parent, il est donc cloné d'abord.