使用具有多个后代的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() );