it-swarm.com.de

XML-Zeichenfolgenblock an vorhandenes XmlDocument anhängen

Ich habe ein XmlDocument, das bereits existiert und aus einer Datei gelesen wird. 

Ich möchte einen Knoten von XML zu einem Knoten im Dokument hinzufügen. Gibt es eine gute Möglichkeit, alle Knoten zu erstellen und hinzuzufügen, ohne meinen Code mit vielen .CreateNote- und .AppendChild-Aufrufen zu überladen?

Ich möchte eine Möglichkeit, einen String oder StringBuilder aus einem gültigen Xml-Abschnitt zu erstellen und diesen einfach an einen XmlNode anzuhängen.

beispiel: Original XmlDoc:

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

und ich möchte dem Mitarbeiter einen demografischen Tag (mit mehreren Kindern) hinzufügen:

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

Ich empfehle die Verwendung von XmlDocument.CreateDocumentFragment , wenn Sie die Daten in freien Formstrings haben. Sie müssen AppendChild weiterhin verwenden, um das Fragment einem Knoten hinzuzufügen. Sie haben jedoch die Freiheit, XML in Ihrem StringBuilder zu erstellen.

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

Versuche dies:

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

Alternativ (wenn Sie ein anderes XML-Dokument verwenden möchten):

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

Alternativ können Sie dies auf LINQy 3.5-Weise tun:

 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

Erwägen Sie die Verwendung eines XmlWriter zum Erstellen Ihrer Fragmente in einem StringBuilder, da dies die Überprüfung und die Ersetzung von Zeichen für Sie ermöglicht.

2
Jeff Yates

Alles, was ich mache, ist ein neues Datensatzobjekt zu erstellen und die XML-Datei mit ReadXML myDataset.ReadXML(path and file name) zu öffnen. 

Fügen Sie dann die benötigten Zeilen hinzu oder entfernen Sie sie, und speichern Sie das Dokument erneut mit myDataset.WriteXML(path and file name).

Tschüss.

0
Ivan

Nichts davon arbeitete für mich, also spielte ich abit und hier ist meine Lösung.

Laden Sie zuerst ein Textfeld (Sie können es in der öffentlichen Version auf visible = false setzen.) Laden Sie die Daten in das Textfeld wie folgt.

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

klicken Sie auf die Schaltfläche "Speichern". Laden Sie das Textfeld hoch und speichern Sie es .. _. Vergessen Sie nicht, dass Sie das Textfeld danach aktualisieren müssen. Wenn Sie mehrere Adressen/Namen hinzufügen möchten, habe ich diesen Teil nicht hinzugefügt.

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