В прошлой статье мы поговорили о том, как удалять элементы из xml-файла. Сегодня же я покажу как можно добавлять новые записи в дерево xml файла.
Структура xml-файла прежняя:
Person.xml
<?xml version="1.0" encoding="utf-8"?>
<PEOPLE>
<Man>
<name>Саша</name>
<surName>Гудок</surName>
<Country>Украина</Country>
</Man>
<Man>
<<name>Андрей</name>
<surName>Нагорный</surName>
<Country>Словакия</Country>
</Man>
<Man>
</PEOPLE>
Процесс добавления новой записи начинается с проверки существования такой же записи в данном документе.
Это можно осуществить либо способом, описанном в статье,
либо приведенным здесь методом CheckForExistPersonByName (информация о всех используемых неописанных в данном коде переменных представлена в статье):
using System.IO;
using System.Xml;
bool CheckForExistPersonByName(string name, string surName)
{
using(FileStream fStream = new FileStream(
path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
System.Xml.XmlDocument CXML = new System.Xml.XmlDocument();
CXML.Load(fStream);
for (int i=0; i<CXML.DocumentElement.ChildNodes.Count; i++)
{
string fname = String.Format("{0}",
CXML.DocumentElement.ChildNodes[i].FirstChild.InnerText);
string fsurname =
CXML.DocumentElement.ChildNodes[i].FirstChild.
NextSibling.InnerText;
if (name == fname && surName == fsurname)
return true;
}
}
return false;
}
Сам же код добавления новой записи будет таким:
string AddPerson(List newData, string description)
{
string[] tagName =
new string[] { "name", "surName", "Country" };
if (CheckForExistPersonByName(newData[0], newData[1]))
return "Такая персона уже имеется в БД";
try
{
//create the reader filestream (fs)
using (fStream = new FileStream(path, FileMode.Open,
FileAccess.Read, FileShare.ReadWrite))
{
//Create the xml document
xmlDoc = new XmlDocument();
//Load the xml document
xmlDoc.Load(fStream);
//Close the fs filestream
fStream.Close();
}
}
catch
{
return "Персона не была добавлена";
}
try
{
XmlElement newitem;
XmlElement newOUTERitem =
xmlDoc.CreateElement("Man");
for (int i = 0; i < tagName.Length; i++)
{
// create the new element (node)
newitem = xmlDoc.CreateElement(tagName[i]);
// Put the value (inner Text) into the node
newitem.InnerText = newData[i];
// Close node
newOUTERitem.AppendChild(newitem);
}
// Close outer node
xmlDoc.DocumentElement.InsertAfter(
newOUTERitem, xmlDoc.DocumentElement.LastChild);
//Save the XML file
FileStream WRITER = new FileStream(path,
FileMode.Truncate, FileAccess.Write,
FileShare.ReadWrite);
xmlDoc.Save(WRITER);
//Close the writer filestream
WRITER.Close();
}
catch
{
return "Персона не была добавлена";
}
}
В прошлых статьях мы достаточно поговорили о нюансах в работе с xmlдокументами, поэтому, объяснять работу данного кода я не стану, тем более, что обширные комментарии это выполнили за меня.