代码之家  ›  专栏  ›  技术社区  ›  Razor

LINQ到XML克隆

  •  3
  • Razor  · 技术社区  · 16 年前

    有人能解释为什么原来的地址XElement street节点发生了变化吗?看起来customer1持有对地址XElement的引用,但是customer2和customer3已经复制了。

    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> 
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Patrick Karcher    16 年前

    同一个元素不能在多个树中。您当然可以在特定树中对同一个像素有多个引用,但是 同一个元素不能在多个树中

    customer1 ,你真的真的加了 address XElement公司。当你把它“添加”到 customer2 ,实际 address1 无法真正添加XElement,因为它已经是另一个XElement中的节点。因为它不能添加原始的 作为节点,XElement构造函数将该XElement的克隆放在 客户2 customer3 . 现在有三个等价的“地址”元素。

        2
  •  8
  •   Jon Skeet    16 年前

    看起来customer1持有 引用地址XElement,但是 副本。

    是的,事情就是这样。从 docs for XElement contents

    添加XNode或XAttribute时 对象,如果新内容没有 父对象,则对象 附加到XML树。如果新的 内容已为父级并且 内容被克隆,新的 克隆的内容附加到XML 树。

    address 没有父对象,因此直接附加。后来,它 有父母,所以先克隆。