2016-03-23 8 views
0

XML düğümünün ve tüm çocuk düğümlerinin ancak farklı XML ana düğümü adının bir kopyasını yapmaya çalışıyorum amaBir XML düğümünün bir kopyasını tüm çocuk düğümleriyle ve değerleriyle, ancak farklı bir adla nasıl yapılır? C# .NET

<Servers> 
    <MyServer> 
    <Host>0.0.0.0</Host> 
    <Port>12</Port> 
    <User>USER</User> 
    </MyServer> 
</Servers> 

ne yapmaya çalışıyorum tüm alt düğümler ve değerleri ancak farklı adla sunucum bir kopyasıdır ... Bu

gibi bir şey: bana bir hata atıyor, bu xml dosyasıdır
<Servers> 
    <MyServer> 
    <Host>0.0.0.0</Host> 
    <Port>12</Port> 
    <User>USER</User> 
    </MyServer> 
    <MyCopyofMyServer> 
    <Host>0.0.0.0</Host> 
    <Port>12</Port> 
    <User>USER</User> 
    </MyCopyofMyServer> 
</Servers> 

Yaptığım şuydu:

public void CopyInterface(string NewServer, string ServerToCopy) 
{ 
    xmldoc.Load(XMLInterfacesFile); 
    XmlNode NodeToCopy = xmldoc.SelectSingleNode("Servers/" + ServerToCopy); 
    XmlNode deep = NodeToCopy.CloneNode(true);  
    deep.InnerXml = deep.InnerXml.Replace(ServerToCopy, NewServer); 
    xmldoc.AppendChild(deep); //Throwing an exception here! 
    xmldoc.Save(XMLInterfacesFile);    
} 

İstisna: Bu belge zaten bir 'DocumentElement' düğümü vardır.

Fikriniz Var mı?

cevap

2

hattı

xmldoc.AppendChild(deep); 

çalışır bir XmlDocument bir öğe eklemek için. Bu, bir kök seviye elemanı eklemeye çalıştığı anlamına gelir. Sorun, belgenizin zaten kök düzey öğesi (Sunucular) içermesi ve başka bir tane ekleyememesidir, böylece bir istisna vardır.

sizin koduyla diğer konu hattı

deep.InnerXml = deep.InnerXml.Replace(ServerToCopy, NewServer); 

yılında yeni adıyla sunucunun adını değiştirmeye çalışıyorsunuz olmasıdır. Maalesef InnerXml şuna benzer:

<Host>0.0.0.0</Host> 
<Port>12</Port> 
<User>USER</User> 

böylece sunucu adı yenilenemez.

Eğer farklı bir yaklaşım deneyebilirsiniz sorunları gidermek için:

// Fint the node you want to replace 
XmlNode NodeToCopy = xmldoc.SelectSingleNode("Servers/" + ServerToCopy); 

// Create a new node with the name of your new server 
XmlNode newNode = xmldoc.CreateElement(NewServer); 

// set the inner xml of a new node to inner xml of original node 
newNode.InnerXml = NodeToCopy.InnerXml; 

// append new node to DocumentElement, not XmlDocument 
xmldoc.DocumentElement.AppendChild(newNode); 

Bu, sonuç vermelidir Eğer

+0

Müthiş gerekiyor! işe yarıyor!! Teşekkürler @dotnetom !! –

İlgili konular