所以我已经谷歌搜索了一段时间,并搜索了一些StackOverflow帖子,我必须遗漏一些东西。我正在使用C#进行一些XML解析,我有一系列类,如下所示。简而言之,“等级”课程包含“课堂”课程列表,课堂有“学生”列表和教师列表。
class Individual
{
public string ID;
public string fName;
public string lName;
public string gradeID;
}
class Classroom
{
public string classID;
public string className;
public string classGrade;
public int numTeachers;
public List<Individual> Students;
public List<Individual> Teachers;
}
class Grade
{
public List<Classroom> Classrooms;
public string classGrade;
}
基本上,在我的程序中,我筛选XML文件并收集学生和教师的列表,并将它们添加到我的教室,而不会覆盖任何一个。这是因为,在循环中,每次XML节点的名称等同于“student”或“teacher”时,我都会创建该类的新实例,因为该类型的新节点表示新的个体。你可以在这里看到:
// node is a student
else if (xmlReader.Name == "student")
{
// create new student object
Individual tempStudent = new Individual();
tempStudent.ID = xmlReader.GetAttribute("id");
tempStudent.fName = xmlReader.GetAttribute("first_name");
tempStudent.lName = xmlReader.GetAttribute("last_name");
tempStudent.gradeID = tempClassroom.classID;
// add student object to classroom list of students
tempClassroom.Students.Add(tempStudent); // classroom class is used inside student and teacher if statements
}
但是,我不能对课堂或年级做同样的事情,因为正如您在上面所看到的,学生和老师都依赖课堂课程进行存储。因此,我无法弄清楚如何创建一个新的教室对象,以便在我成绩时。添加(课堂)我可以开始修改教室而不修改成绩中已有的节点。而且,每次新教室出现时,我宁愿不必编写深层复制功能,因为这将非常缓慢。
编辑:示例XML文件: https://pastebin.com/XzSxgLdb
这段代码似乎解决了我的问题。当xmlNodeType是EndElement时,我检查了名称,然后根据需要创建了新的教室或新成绩。我没有任何覆盖,所以似乎已经清理了一切。
我觉得C#应该知道当你将一个对象添加到你想要保存该对象的容器时,所以C#应该为一个新对象创建一个新的引用。但我想情况并非如此。需要在每次需要时明确声明一个新对象。
case XmlNodeType.EndElement:
if (xmlReader.Name == "classroom")
{
// at end of classroom element so add classroom to list
tempClassroom.numTeachers = teacherCounter;
grade.Classrooms.Add(tempClassroom);
if (teacherCounter > highestNumberOfTeachers) // collect the highest number of recorded teachers in a classroom
highestNumberOfTeachers = teacherCounter;
teacherCounter = 0;
tempClassroom = new Classroom();
}
if (xmlReader.Name == "grade")
{
// at end of grade element so prepare for next grade level
Grades.Add(grade);
grade = new Grade();
}