3

複数の XML フィールドの解析に問題があります

これは XML のスタイルです:

<students>
  <student>
    <student_id>1</student_id>
    <student_name>Mike</student_name>
    <subjects>
      <subject>
        <school_subject>History</school_subject>
      </subject>
      <subject>
        <school_subject>Maths</school_subject>
      </subject>
      <subject>
        <school_subject>English</school_subject>
      </subject>
    </subjects>
  </student>
  <student>
    ...
  </student>
</students>

Student_id や Student_name などの単純なフィールドを解析できますが、同じフィールドが複数回繰り返される場合、どうすればよいかわかりません:/ これは解析のソース コードです。

私は2つのクラスを作りました:

  • 教科名を含む教科
  • ID と名前、およびクラス Subject のリストを含む学生。

ソースコード:

List<Student> L1 = new List<Student>();

XDocument doc = XDocument.Load(s);
var q = from b in doc.Descendants("student")
select new
{
    s_id = (string)b.Element("student_id"),
    s_name = (string)b.Element("student_name"),
    s_subject = (Subject)b.Elements("school_subject")
};
foreach (var p in q)
{
    L1.Add(new Student() { id = p.s_id, name = p.s_name, subject = p.s_subject });
}
listBox1.ItemsSource = L1;

読んでくれてありがとう。私のとても下手な英語でごめんなさい。

4

2 に答える 2

5

あなたのxmlによると、学生はいくつかの科目を持つことができます。したがって、学生の所有物として科目のコレクションが必要です。

public class Student
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Subject> Subjects { get; set; }
}

public class Subject
{
    public string Name { get; set; }
}

そして、ここで解析します。学生の科目を取得するには、サブクエリを実行する必要があります。

XDocument xdoc = XDocument.Load(s);
IEnumerable<Student> students =
    from s in xdoc.Descendants("student")
    select new Student()
    {
        Id = (int)s.Element("student_id"), // you can cast to int
        Name = (string)s.Element("student_name"),
        Subjects = s.Element("subjects") // here goes sub query
                    .Elements("subject")
                    .Select(subj => new Subject() { 
                       Name = (string)subj.Element("school_subject") 
                    }).ToList()
    };

ところで、単純な文字列を使用してサブジェクト名を保持できると思います-そのためのクラスは本当に必要ありません。

于 2012-12-16T19:14:29.670 に答える
0

xmlには複数のサブジェクトs_subjectがあるためlistSubject

doc.Elements("Student").Select(
x=>
    s_id = (string)x.Element("student_id"),
    s_name = (string)x.Element("student_name"),
    s_subject = x.Element("subjects").Elements("subject")
                 .Select(s=>s.Element("school_subject").Value)
                 .ToList<Subject>()
);
于 2012-12-16T18:54:53.383 に答える