Xml节点正在被另一个节点取代

时间:2014-05-16 15:24:30

标签: c# xml forms xmlwriter

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

2 个答案:

答案 0 :(得分:0)

您使用此行清除所有部门。因此,之前存在的任何内容都会从文件中删除:

xNode.RemoveAll();

其次,在foreach courses上,您将所有课程添加到该部门。由于您既没有按部门对课程进行排序或过滤,而是将它们全部放入combobox.Text所选择的部门。

答案 1 :(得分: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 Class

using System.Collections.Generic;

namespace Serializer
{
    public class FST_Department
    {
        public List<Course> Course_Details { get; set; }
    }
}

Medicine_Department Class

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>