Добавление существующего XML-файла с помощью XmlWriter

Я использовал следующий код для создания 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.WriteEndElement(); xmlWriter.WriteEndDocument(); xmlWriter.Close(); } 

Мне нужно динамически вставлять узлы, создавая следующую структуру:

    David Smith  ...  David Smith  ...  

Как мне это сделать? Значения «FirstName» и «LastName» должны считываться с клавиатуры, и значения могут быть введены в любое время, конечно, по существу.

5 Solutions collect form web for “Добавление существующего XML-файла с помощью XmlWriter”

вы можете использовать Linq Xml

 XDocument doc = XDocument.Load(xmlFilePath); XElement school = doc.Element("School"); school.Add(new XElement("Student", new XElement("FirstName", "David"), new XElement("LastName", "Smith"))); doc.Save(xmlFilePath); 

редактировать

если вы хотите добавить элемент в существующий , просто добавьте атрибут до

 school.add(new XElement("Student", new XAttribute("ID", "ID_Value"), new XElement("FirstName", "David"), new XElement("LastName", "Smith"))); 

Затем вы можете добавить дополнительные данные в существующий по поиску -> get -> add

 XElement particularStudent = doc.Element("School").Elements("Student") .Where(student => student.Attribute("ID").Value == "SearchID") .FirstOrDefault(); if(particularStudent != null) particularStudent.Add(new XElement("",""); 

наконец, я преуспел 🙂

 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 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"); } 

Позвольте мне дать вам предложение. Когда вы создаете свой XML-файл, дайте уникальный идентификатор своим ученикам следующим образом:

 // to store the id variable, if you create more than one student you can increase it count = 0; xmlWriter.WriteStartElement("School"); xmlWriter.WriteAttributeString("ID",count.ToString()); xmlWriter.WriteEndElement(); 

Затем, когда вам нужно добавить информацию к этому учащемуся, вы можете получить ID , имя и Lastname и вы можете редактировать свой XML-файл с помощью LINQ to XML следующим образом:

 int id = Convert.ToInt32(txtStudentId.Text); XDocument xDoc = XDocument.Load("Test.xml"); XElement student = xDoc.Descendants("Student").Where(x => (string) x.Attribute("ID") == id).FirstOrDefault(); if (student != null) { string firstName = txtFirstName.Text; string lastName = txtLastName.Text; XElement first = new XElement("FirstName", firstName); XElement last = new XElement("LastName", lastName); student.Add(first); student.Add(last); xDoc.Save("Test.xml"); } 

Я знаю, что вы просили XmlWriter, но я считаю, что вы можете добиться этого, используя меньше кода с XDocument. Вот мое решение:

 var filePath = "path/XmlFile.xml"; var xmlDoc = XDocument.Load(filePath); var parentElement = new XElement("Student"); var firstNameElement = new XElement("FirstName", firstNameVariable); var lastNameElement = new XElement("LastName", lastNameVariable); parentElement.Add(firstNameElement); parentElement.Add(lastNameElement); var rootElement = xmlDoc.Element("School"); rootElement?.Add(parentElement); xmlDoc.save(); 

Это основано на следующей структуре XML и будет добавляться в ... :

   John Johnson  ...  

Надеюсь это поможет!

У меня есть предложение в следующий раз:

 string nameFile = "Test.xml"; bool newFile = false; if (!File.Exists(nameFile)) { newFile = true; XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); xmlWriterSettings.Indent = true; xmlWriterSettings.NewLineOnAttributes = true; xmlWriter.WriteStartDocument(); xmlWriter.WriteStartElement("School"); xmlWriter = XmlWriter.Create("Test.xml", xmlWriterSettings)) } else { doc = new XmlDocument(); doc.Load(nameFile); // Create a XPathNavigator // You can go where you want to add // In this case it is just after last child of the roor XPathNavigator navigator = doc.CreateNavigator(); navigator.MoveToChild("School", ""); xmlWriter = navigator.AppendChild(); } // From here you can work only with xmlWriter, // One will point on a file and the other on the stream of xmlDocument // So you will need to save the document in the second choise xmlWriter.WriteStartElement("Student"); xmlWriter.WriteElementString("FirstName", firstName); xmlWriter.WriteElementString("LastName", lastName); xmlWriter.WriteEndElement(); // End document / close or save. if (newFile) xmlWriter.WriteEndDocument(); xmlWriter.Close(); if (!newFile) doc.Save(nameFile); 

Он должен работать. 🙂

Давайте будем гением компьютера.