Search code examples
c#xmlxmlreaderxmlwriter

Appending an existing XML file with XmlWriter


I've used the following code to create an XML file:

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
xmlWriterSettings.Indent = true;
xmlWriterSettings.NewLineOnAttributes = true;
using (XmlWriter xmlWriter = XmlWriter.Create("Test.xml", xmlWriterSettings))
{
   xmlWriter.WriteStartDocument();
   xmlWriter.WriteStartElement("School");
   xmlWriter.WriteEndElement();
   xmlWriter.WriteEndDocument();
   xmlWriter.Close();
 }

I need to insert nodes dynamically creating the following structure:

<?xml version="1.0" encoding="utf-8"?>
<School />
   <Student>
      <FirstName>David</FirstName>
      <LastName>Smith</LastName>
   </Student>
   ...
   <Teacher>
      <FirstName>David</FirstName>
      <LastName>Smith</LastName>
   </Teacher>
   ...
</School>

How can I do it? The values of "FirstName" and "LastName" should be read from the keyboard and the values ​​can be entered at any time, of course under existing.


Solution

  • finally I succeeded :)

    if (!File.Exists("Test.xml"))
    {
       XmlWriterSettings xmlWriterSettings = new XmlWriterSettings();
       xmlWriterSettings.Indent = true;
       xmlWriterSettings.NewLineOnAttributes = true;
       using (XmlWriter xmlWriter = XmlWriter.Create("Test.xml", xmlWriterSettings))
       {
          xmlWriter.WriteStartDocument();
          xmlWriter.WriteStartElement("School");
    
          xmlWriter.WriteStartElement("Student");
          xmlWriter.WriteElementString("FirstName", firstName);
          xmlWriter.WriteElementString("LastName", lastName);
          xmlWriter.WriteEndElement();
    
          xmlWriter.WriteEndElement();
          xmlWriter.WriteEndDocument();
          xmlWriter.Flush();
          xmlWriter.Close();
       }
    }
    else
    {
       XDocument xDocument = XDocument.Load("Test.xml");
       XElement root= xDocument.Element("School");
       IEnumerable<XElement> rows = root.Descendants("Student");
       XElement firstRow= rows.First();
       firstRow.AddBeforeSelf(
          new XElement("Student",
          new XElement("FirstName", firstName),
          new XElement("LastName", lastName)));
       xDocument.Save("Test.xml");
    }