web-dev-qa-db-fra.com

Ajouter un bloc de chaîne XML à XmlDocument existant

J'ai un XmlDocument qui existe déjà et est lu à partir d'un fichier. 

Je voudrais ajouter un morceau de XML à un nœud du document. Existe-t-il un bon moyen de créer et d’ajouter tous les nœuds sans encombrer mon code de nombreux appels .CreateNote et .AppendChild?

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

ex: Original XmlDoc:

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

et, j'aimerais ajouter une balise Demographic (avec plusieurs enfants) à Employee:

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

Je suggère d'utiliser XmlDocument.CreateDocumentFragment si vous avez les données sous forme de chaînes de forme libre. Vous devrez toujours utiliser AppendChild pour ajouter le fragment à un nœud, mais vous avez la liberté de créer le code 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);
80
user7116

Essaye ça:

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

Alternativement (si vous souhaitez utiliser un autre document XML):

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

En guise d'alternative, voici comment vous pouvez 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");
6
Echostorm

Pensez à utiliser un XmlWriter pour créer vos fragments sur un StringBuilder car cela vous fournira une validation et une substitution de caractères.

2
Jeff Yates

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

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

Au revoir.

0
Ivan

Rien de tout cela ne fonctionnait pour moi alors j'ai joué abit et voici ma solution.

Commencez par charger un champ de texte (vous pouvez le mettre à visible = false dans la version publique) Charger les données dans le champ de texte de la manière suivante.

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

sur le bouton de sauvegarde, chargez le champ de texte et sauvegardez-le . N'oubliez pas qu'il vous faudra actualiser 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");
0
Peter Gruppelaar