解析XML使用LINQ多个后代 [英] Parsing XML with Linq with multiple descendants

查看:249
本文介绍了解析XML使用LINQ多个后代的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个probleme解析多个XML领域

I have a probleme to parse multiple XML field

这一个的XML的风格:

This a the style of the 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但简单的字段时,也有相同的多个重复现场,我不知道该怎么做:/
这是解析我的源代码

I can parse it for the simple field like student_id and student_name but when there are multiple repetition of a same field I don't know how to do :/ This is my source code of the parsing.

我做了两个类:


  • 包含学校科目

  • 学生包含ID和名称和类主题的列表的名称主题。

现在的源代码:

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;



感谢您的阅读和我很糟糕的英语抱歉。

Thanks for reading and sorry for my very bad english.

推荐答案

根据您的XML学生可以有多个科目。所以,你需要的学科集合作为学生的属性:

According to your xml student can have several subjects. So, you need collection of subjects as property of student:

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

和这里解析。为了填补得到学生的科目,你需要做的子查询:

And here is parsing. To fill get student's subjects you need to do sub query:

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



BTW,我认为可以用简单的字符串来保存主题名称 - 你并不真正需要的类这一点。

BTW I think you can use simple string to hold subject name - you don't really need class for that.

这篇关于解析XML使用LINQ多个后代的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆