0

3 つのクラスがあり、すべてのクラスのデータを 1 つの 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;
    }
}

2 番目のクラスは次のとおりです。

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;
    }
}

3 番目のクラスは次のとおりです。

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

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

XMLファイルにすべてのデータを保存するDBクラスも作成しました。

    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 に Student クラスと Teacher クラスを追加する方法です。追加しようとしましたが、機能しません。助けてください。

4

3 に答える 3

0

あなたのコードから見ると、これらの 3 行でエラーが発生しているはずです。:

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

あなたがしたいことはPersonStudentと をTeacher別々に保存することだと思いますが、同じファイルに同じロジックを使用しますか? 多分このようなもの:

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();

(...)

次に、データを書き込む 3 つのヘルパー メソッドを作成します。これは学生向けの例です。

// (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の代わりにAssignmentGrade) 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 に答える