0

我有三个类,我想在一个 XML 文件中添加所有类数据?

第一类是:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }


    public override string ToString()
    {
        return FirstName + " " +LastName + " "  +Email;
    }
}

第二类是:

public class Student:Person
{

    public Student()
    {
    }
    public double AssessmentGrade { get; set; }
    public double AssignmentGrade { get; set; }

    public override string ToString()
    {
        return base.ToString() + "," +AssessmentGrade + "," + AssignmentGrade;
    }
}

第三类是:

public class Teacher:Person
{
    public string RoomNumber
    {
        get;
        set;
    }

    public override string ToString()
    {
        return base.ToString() + "," + RoomNumber;
    }
}

我也创建了一个 DB 类,将所有数据存储在 XML 文件中。

    private const string path = @"Persons.xml";

    Public static void SavePersons(List<Person> Persons)
    {
        XmlWriterSettings settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.IndentChars = ("   ");

        XmlWriter xmlOut = XmlWriter.Create(path, settings);
        xmlOut.WriteStartDocument();
        xmlOut.WriteStartElement("Persons");

        foreach (Person person in Persons)
        {
            Student student = new Student();
            Teacher teacher = new Teacher();

            xmlOut.WriteStartElement("Person");
            xmlOut.WriteAttributeString("Email", person.Email);
            xmlOut.WriteElementString("Firstname", person.FirstName);
            xmlOut.WriteElementString("Lastname", person.LastName);
            xmlOut.WriteElementString("AssessmentGrade",
                                      student.AssessmentGrade.ToString());
            xmlOut.WriteElementString("AssignmentGrade", 
                                      student.AssignmentGrade.ToString());
            xmlOut.WriteElementString("Room", teacher.RoomNumber.ToString());

            xmlOut.WriteEndElement();

        }
        xmlOut.WriteEndElement();
        xmlOut.Close();
    }

现在的问题是如何在同一个 XML 中添加学生类和教师类。我尝试添加但它不起作用。你能帮帮我吗?

4

3 回答 3

0

从我在您的代码中可以看到,这三行应该是错误的。:

xmlOut.WriteElementString("AssessmentGrade", student.AssessmentGrade.ToString());
xmlOut.WriteElementString("AssignmentGrade", student.AssignmentGrade.ToString());
xmlOut.WriteElementString("Room", teacher.RoomNumber.ToString());

这是因为您在上面声明了新的学生和教师对象,但没有提供 AssessmentGrade/AssignmentGrade/RoomNumber 的值。

我明白你的问题是什么吗?

student.AssessmentGrade = 90;
于 2012-08-14T22:09:26.627 回答
0

我认为您想要做的是单独存储Person,但在同一个文件中,并使用相同的逻辑StudentTeacher也许是这样的:

foreach (Person person in Persons)
{
    // Edit: After reading the comment below, I 
    // updated the methods to return an XmlWriter. This
    // way, you should be able to contiune working with the 
    // same instance:
    if(typeOf(Student).IsInstanceOfType(person)){
        xmlOut = AppendStudentInfo(person, xmlOut);
    }else if(typeOf(Teacher).IsInstanceOfType(person){
        xmlOut = AppendTeacherInfo(person, xmlOut);
    }else{
        xmlOut = AppendPersonInfo(person, xmlOut);
    }
}

xmlOut.WriteEndElement();
xmlOut.Close();

(...)

然后创建三个辅助方法来写入数据。这是学生的示例:

// (Edit: Updated to return an XmlWriter)
private XmlWriter AppendStudentInfo(Person person, XmlWriter xmlOut){

    Student student = (Student) person;
    // For teacher, use this instead:
    // Teacher teacher = (Teacher) person;

    xmlOut.WriteStartElement("Student");
    xmlOut.WriteAttributeString("Email", student.Email);
    xmlOut.WriteElementString("Firstname", student.FirstName);
    xmlOut.WriteElementString("Lastname", student.LastName);
    xmlOut.WriteElementString("AssessmentGrade",
                              student.AssessmentGrade.ToString());
    xmlOut.WriteElementString("AssignmentGrade", 
                              student.AssignmentGrade.ToString());
    xmlOut.WriteEndElement();

    // (Edit: Updated to return an XmlWriter)
    return xmlOut;
}

现在对于Teacher,您将执行相同的操作,但使用该类型而不是Student,并包括与教师类型相关的字段(即Room,而不是AssignmentGradeand AssessmentGrade)。

对于 Person,您也可以这样做,但只包括存在于 class 中的字段Person

我没有测试过这段代码,但相信它应该或多或少是正确的。希望这类似于您正在寻找的答案。

于 2012-08-15T13:11:42.750 回答
0

使用 DataContractSerializer 对 xml 格式的数据进行序列化:

Public static void SavePersons(Persons persons)
{
  var serializer = new DataContractSerializer(typeof(Persons));
  // Create a FileStream to write with.
  FileStream fs = new FileStream("file.xml", FileMode.Create);
  using (fs)
  {
     ser.WriteObject(fs, p);
  }
}

班级人员:

[KnownType(typeof(Student))] 
[KnownType(typeof(Teacher))]
[DataContract]
public class Persons
{
    [DataMember]
    public IEnumerable<Person>{get;set;}
}

另一个例子:MSDN文章

于 2012-08-15T13:12:31.963 回答