XML-узел заменяется другим

1

Я хочу писать университетские курсы в 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");
    }
}
Теги:
forms
xmlwriter

2 ответа

0

Отложите его и используйте 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>
  • 0
    Использовал класс сериализатора. Работает нормально, если я запускаю его и добавляю что-то в xml, но когда я снова открываю его, обновляет xml-файл, все пишется с нуля, как будто он открывает «новый» xml-файл.
  • 0
    Не могли бы вы уточнить немного больше. Когда вы десериализуете XML, у вас будут отделы, содержащие все в XML. Вы добавляете / удаляете / меняете предметы. Когда вы сериализуете его обратно в файл, тогда if запишет его обратно со всем, что в нем содержится.
0

Вы очищаете все отделы этой линией. Итак, все, что было до этого, вытирается из файла:

xNode.RemoveAll();

Во-вторых, с вашим foreach на courses, вы добавите все курсы в этот отдел. Поскольку вы не сортируете или не фильтруете курсы по отделам, вы получаете их все в любой combobox.Text.

  • 0
    Сейчас это работает, курсы в соответствующем отделе, но в том порядке, в котором я их добавил. <FST> </ FST> <медицина> </ медицина> <медицина> </ медицина>
  • 0
    @ user3645080 Да, потому что вы не сортируете их. Вы просто добавляете их в конец файла. Вам придется придумать метод Insert вместо используемого вами добавления.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню