Я хочу писать университетские курсы в XML файле и сортироваться по отделам. Поэтому, если я добавлю курс из разных отделов, я получу что-то вроде:
<Departments>
<FST_Department>
<Course_Details>
<Course_Name >Networking</Course_Name>
<Course_Code >xx</Course_Code>
</Course_Details>
</FST_Department >
<Medicine_Department>
<Course_Details>
<Course_Name >General_Medicine</Course_Name>
<Course_Code >xxxxxxx</Course_Code>
</Course_Details>
</Medicine_Department>
</Departments
Но вместо этого все мои курсы входят в последний отдел, я добавил курс, и теги другого отдела исчезли. Как показано ниже.
<Departments>
<Medicine_Department>
<Course_Details>
<Course_Name >Networking</Course_Name>
<Course_Code >xx</Course_Code>
</Course_Details>
<Course_Details>
<Course_Name >General Medicine</Course_Name>
<Course_Code >xxxxxxx</Course_Code>
</Course_Details>
</Medicine_Department>
</Departments
Код для создания xml файла.
string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
if (!Directory.Exists(path = "E:\\Sorting\\Directory"))
Directory.CreateDirectory(path = "E:\\Sorting\\Directory");
if (!File.Exists(path = "E:\\Sorting\\Directory\\Sort.xml"))
{
XmlTextWriter xW = new XmlTextWriter(path ="E:\\Sorting\\Directory\\Sort.xml", Encoding.UTF8);
xW.WriteStartElement("Departments");//my root
xW.WriteEndElement(); // Departments
xW.Close();
Это код, который я использую для добавления данных в файл xml:
string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
XmlDocument xDoc = new XmlDocument();
xDoc.Load("E:\\Sorting\\Directory\\Sort.xml");
XmlNode xNode = xDoc.SelectSingleNode("Departments");
xNode.RemoveAll();
if (combboBox.Text == "FST")
{
XmlNode xDepartmentNode = xDoc.CreateElement("FST_Department");
foreach (Course c in courses)
{
XmlNode xCourse_Details = xDoc.CreateElement("Course_Details");
XmlNode xCode = xDoc.CreateElement("Course_Code");
xCode.InnerText = c.courseCode;
xCourse_Details.AppendChild(xCode);
XmlNode xName = xDoc.CreateElement("Course_Name");
xName.InnerText = c.courseName;
xCourse_Details.AppendChild(xName);
xDepartmentNode.AppendChild(xCourse_Details);
xDoc.DocumentElement.AppendChild(xDepartmentNode);
xDoc.Save("E:\\Sorting\\Directory\\Sort.xml");
}
}
else if(combbobox.Text == "Medicine")
{
XmlNode xDepartmentNode = xDoc.CreateElement("Medicine_Department");
foreach (Course c in courses)
{
XmlNode xCourse_Details = xDoc.CreateElement("Course_Details");
XmlNode xCode = xDoc.CreateElement("Course_Code");
xCode.InnerText = c.courseCode;
xCourse_Details.AppendChild(xCode);
XmlNode xName = xDoc.CreateElement("Course_Name");
xName.InnerText = c.courseName;
xCourse_Details.AppendChild(xName);
xDepartmentNode.AppendChild(xCourse_Details);
xDoc.DocumentElement.AppendChild(xDepartmentNode);
xDoc.Save("E:\\Sorting\\Directory\\Sort.xml");
}
}
Отложите его и используйте XML Serialization lol
Класс департаментов
using System.Xml.Serialization;
namespace Serializer
{
public class Departments
{
public FST_Department FST_Department { get; set; }
public Medicine_Department Medicine_Department { get; set; }
}
}
Класс FST_Department
using System.Collections.Generic;
namespace Serializer
{
public class FST_Department
{
public List<Course> Course_Details { get; set; }
}
}
Медицина_Департамент класса
using System.Collections.Generic;
namespace Serializer
{
public class Medicine_Department
{
public List<Course> Course_Details { get; set; }
}
}
Класс курса
namespace Serializer
{
public class Course
{
public string Course_Name { get; set; }
public string Course_Code { get; set; }
}
}
Чтение и запись сериализованного xml
using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO;
namespace Serializer
{
class XMLManager
{
private const string configFileName = "Departments.xml";
public static Departments Read()
{
XmlSerializer reader = new XmlSerializer(typeof(Departments));
using (FileStream file = File.OpenRead(Path.Combine(Global.AppRoot, configFileName)))
{
return reader.Deserialize(file) as Departments;
}
}
public static void Write(Departments settings)
{
XmlSerializer writer = new XmlSerializer(typeof(Departments));
using (FileStream file = File.Create(Path.Combine(Global.AppRoot, configFileName)))
{
writer.Serialize(file, settings);
}
}
}
}
Применение
Departments depart = new Departments();
FST_Department fst = new FST_Department();
fst.Course_Details = new List<Course>();
Course course = new Course();
course.Course_Code = "1";
course.Course_Name = "Test 1";
fst.Course_Details.Add(course);
course = new Course();
course.Course_Code = "2";
course.Course_Name = "Test2";
fst.Course_Details.Add(course);
depart.FST_Department = fst;
Medicine_Department med = new Medicine_Department();
med.Course_Details = new List<Course>();
course = new Course();
course.Course_Code = "3";
course.Course_Name = "Test 3";
med.Course_Details.Add(course);
depart.Medicine_Department = med;
//put it all in some kind of order in case things were added out of order
depart.FST_Department.Course_Details.OrderBy(c => c.Course_Code);
depart.Medicine_Department.Course_Details.OrderBy(c => c.Course_Code);
XMLManager.Write(depart);
Выход файла XML
<?xml version="1.0"?>
<Departments xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<FST_Department>
<Course_Details>
<Course>
<Course_Name>Test 1</Course_Name>
<Course_Code>1</Course_Code>
</Course>
<Course>
<Course_Name>Test2</Course_Name>
<Course_Code>2</Course_Code>
</Course>
</Course_Details>
</FST_Department>
<Medicine_Department>
<Course_Details>
<Course>
<Course_Name>Test 3</Course_Name>
<Course_Code>3</Course_Code>
</Course>
</Course_Details>
</Medicine_Department>
</Departments>
Вы очищаете все отделы этой линией. Итак, все, что было до этого, вытирается из файла:
xNode.RemoveAll();
Во-вторых, с вашим foreach
на courses
, вы добавите все курсы в этот отдел. Поскольку вы не сортируете или не фильтруете курсы по отделам, вы получаете их все в любой combobox.Text
.