2008-10-07 4 views
25

J'ai un objet XmlDocument qui existe déjà et qui est lu à partir d'un fichier.Ajout d'un bloc de chaînes XML à un objet XmlDocument existant

Je voudrais ajouter un morceau de Xml à un noeud dans le document. Y at-il un bon moyen de créer et d'ajouter tous les nœuds sans encombrer mon code avec de nombreux appels .CreateNote et .AppendChild?

Je voudrais un moyen de faire une chaîne ou un stringBuilder d'une section Xml valide et juste l'ajouter à un XmlNode.

ex: XmlDoc d'origine:

<MyXml> 
    <Employee> 
    </Employee> 
</MyXml> 

et, je voudrais ajouter un portrait démographique (avec plusieurs enfants) étiquette à l'employé:

<MyXml> 
    <Employee> 
     <Demographic> 
     <Age/> 
     <DOB/> 
     </Demographic> 
    </Employee> 
</MyXml> 

Répondre

71

Je suggère d'utiliser XmlDocument.CreateDocumentFragment si vous avez la données dans des chaînes de forme libre. Vous devrez toujours utiliser AppendChild pour ajouter le fragment à un nœud, mais vous avez la liberté de construire le XML dans votre StringBuilder.

XmlDocument xdoc = new XmlDocument(); 
xdoc.LoadXml(@"<MyXml><Employee></Employee></MyXml>"); 

XmlDocumentFragment xfrag = xdoc.CreateDocumentFragment(); 
xfrag.InnerXml = @"<Demographic><Age/><DOB/></Demographic>"; 

xdoc.DocumentElement.FirstChild.AppendChild(xfrag); 
+2

Court et droit ... excellent! +1 – tigerswithguitars

+0

Excellente solution – Nirman

+0

et s'il y a des guillemets (") comme dans les attributs dans le fragment? – Raulp

11

Essayez ceci:

employeeNode.InnerXml = "<Demographic><Age/><DOB/></Demographic>"; 

Sinon (si vous avez un autre document XML que vous souhaitez utiliser):

employeeNode.AppendChild(employeeNode.OwnerDocument.ImportNode(otherXmlDocument.DocumentElement, true)); 
2

Pensez à utiliser un XmlWriter pour construire vos fragments sur un StringBuilder car cela fournira la validation et la substitution de caractères pour vous.

+0

@ffpf: +1 bon conseil, mais les espaces de noms et XmlWriter me font toujours revenir à MSDN. – user7116

6

Comme alternative, voici comment vous pourriez le faire d'une manière plus LINQy 3.5:

XDocument doc = XDocument.Load(@"c:\temp\test.xml"); 
XElement demoNode = new XElement("Demographic"); 
demoNode.Add(new XElement("Age")); 
demoNode.Add(new XElement("DOB")); 
doc.Descendants("Employee").Single().Add(demoNode); 
doc.Save(@"c:\temp\test2.xml"); 
0

Tout ce que je fais est la création d'un nouvel objet ensemble de données et ouvrez le fichier XML à l'aide ReadXML myDataset.ReadXML(path and file name).

Puis ajoutez ou supprimez les lignes dont j'ai besoin et enregistrez à nouveau le document en utilisant myDataset.WriteXML(path and file name).

Salut.

0

Rien de tout cela ne fonctionnait pour moi, donc j'ai joué autour de ABIT et voici ma solution.

Chargez d'abord un champ de texte (vous pouvez le mettre à visible = false dans la version publique) charger les données dans le champ de texte comme tel.

string Path = Directory.GetCurrentDirectory() + "/2016"; 
      string pathFile = Path + "/klanten.xml"; 
      StreamReader sr = new StreamReader(pathFile); 
      txt.Text = sr.ReadToEnd(); 
      sr.Close(); 

Sur le bouton Enregistrer, chargez le champ de texte et enregistrez-le. N'oubliez pas que vous devrez rafraîchir le champ de texte après cela, si vous voulez ajouter plusieurs adresses/noms, je n'ai pas inclus cette partie.

string name = Globals.s_Name; 
     string klanten = txt.Text; 
     string s = klanten; 
     XmlDocument xdoc = new XmlDocument(); 

     string klant = "<voornaam>" + naamBox1.Text + "</voornaam>"; 
     xdoc.LoadXml(s); 
     XmlDocumentFragment xfrag = xdoc.CreateDocumentFragment(); 
     xfrag.InnerXml = klant; 
     xdoc.DocumentElement.FirstChild.AppendChild(xfrag); 
     xdoc.Save(name + "/klanten.xml"); 
Questions connexes