使用具有多个后代的Linq解析XML

我有一个问题来解析多个XML字段

这是XML的风格:

  1 Mike   History   Maths   English     ...   

我可以解析像student_id和student_name这样的简单字段,但是当同一个字段有多次重复时我不知道该怎么做:/这是我解析的源代码。

我做了两节课:

  • 主题包含学校科目的名称
  • 包含id和名称以及类Subject的列表的学生。

现在源代码:

 List L1 = new List(); 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; 

感谢您阅读并抱歉我非常糟糕的英语。

根据你的xml学生可以有几个科目。 因此,您需要收集作为学生财产的科目:

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

这里是解析。 要填写学生的科目,您需要进行子查询:

 XDocument xdoc = XDocument.Load(s); IEnumerable 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() }; 

顺便说一下,我认为你可以使用简单的字符串来保存主题名称 – 你真的不需要上课。

因为你在xml中有多个主题s_subject应该是一个Subject list

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