Добавление существующего файла 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();
 }

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

<?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>

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


person user3105160    schedule 04.01.2014    source источник
comment
Больше всего вы бы использовали XmlDocument, или XDocument, или Serailisation, чтобы сделать что-то подобное. Выбор XmlWriter очень странный.   -  person Tony Hopkinson    schedule 04.01.2014


Ответы (5)


вы можете использовать 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);

Изменить

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

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

Затем вы можете добавить дополнительные сведения к существующему <Student> с помощью поиска -> получить -> добавить

XElement particularStudent = doc.Element("School").Elements("Student")
                                .Where(student => student.Attribute("ID").Value == "SearchID")
                                .FirstOrDefault();
if(particularStudent != null)
    particularStudent.Add(new XElement("<NewElementName>","<Value>");
person Gokul E    schedule 04.01.2014
comment
но ваш код создает новый элемент.OP хочет добавить новые элементы к существующему элементу - person Selman Genç; 04.01.2014
comment
точно. Я хочу добавлять новые элементы каждый раз, когда мне это нужно - person user3105160; 04.01.2014
comment
Извините, но я в замешательстве. XML используется впервые. - person user3105160; 04.01.2014
comment
действительно :) спасибо за помощь, и если вы поможете мне выполнить этот шаг, я был бы очень благодарен;) - person user3105160; 04.01.2014

наконец у меня получилось :)

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");
}
person user3105160    schedule 04.01.2014
comment
XDocument прочитает весь файл в память, что не всегда проблема, но об этом следует знать. - person Banshee; 04.06.2015

Позвольте мне дать вам предложение. Когда вы создаете свой 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, Firstname и 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");
}
person Selman Genç    schedule 04.01.2014

Я знаю, что вы просили 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 и будет добавлено в ... :

<School>
  <Student>
    <FirstName>John</FirstName>
    <LastName>Johnson</LastName>
  </Student>
...
</School>

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

person blueprintchris    schedule 13.01.2017

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

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

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

person Al3x_M    schedule 19.10.2016