LINQ to XML 克隆
Posted
技术标签:
【中文标题】LINQ to XML 克隆【英文标题】:LINQ to XML Cloning 【发布时间】:2011-02-07 10:51:18 【问题描述】:谁能解释为什么原始地址 XElement 街道节点会发生变化?看起来 customer1 持有对地址 XElement 的引用,但 customer2 和 customer3 已复制。
为什么原来的地址变了? (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();
输出
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>
【问题讨论】:
【参考方案1】:来自问题:
看起来 customer1 持有一个 引用地址 XElement 但 customer2 和 customer3 已采取 副本。
是的,这正是发生的事情。来自docs for XElement contents:
添加 XNode 或 XAttribute 时 对象,如果新内容没有 父母,那么对象只是 附加到 XML 树。如果新 内容已经是父级并且是 另一个 XML 树的一部分,然后是新的 内容被克隆,新的 克隆的内容附加到 XML 树。
在第一种情况下,address
没有父级,因此直接附加。之后,它确实有一个父对象,所以它首先被克隆。
【讨论】:
【参考方案2】:同一个 XElement 不能在多个树中。您当然可以在特定树中对同一个 XElement 有多个引用,但同一个 XElement 不能在多个树中。
致customer1
,您确实添加了address
XElement。当您将它“添加”到customer2
时,实际的address1
XElement 无法真正添加,因为它已经是另一个XElement 中的一个节点。由于无法将原始address
添加为节点,XElement 构造函数将该XElement 的克隆放置在customer2
和customer3
中。您现在拥有三个等效的“地址”XElement。
【讨论】:
以上是关于LINQ to XML 克隆的主要内容,如果未能解决你的问题,请参考以下文章
Git 克隆仓库报unable to get local issuer certificate错误解决方法