C# 使用具有多个子体的Linq解析XML

C# 使用具有多个子体的Linq解析XML,c#,xml,linq,silverlight,windows-phone-7.1,C#,Xml,Linq,Silverlight,Windows Phone 7.1,我在解析多个XML字段时遇到了一个问题 这是XML的一种风格: <students> <student> <student_id>1</student_id> <student_name>Mike</student_name> <subjects> <subject> <school_subject>History</schoo

我在解析多个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>

1.
迈克
历史
数学
英语
...
我可以将其解析为简单字段,如student_id和student_name,但当同一字段存在多次重复时,我不知道如何处理:/ 这是我解析的源代码

我上了两门课:

  • 包含学校科目名称的科目
  • 包含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;
List L1=新列表();
XDocument doc=XDocument.Load;
var q=来自文件子体(“学生”)中的b
选择新的
{
s_id=(字符串)b.Element(“学生id”),
s_name=(字符串)b.Element(“学生名”),
s_科目=(科目)b.Elements(“学校科目”)
};
foreach(q中的var p)
{
L1.添加(新学生(){id=p.s_id,name=p.s_name,subject=p.s_subject});
}
listBox1.ItemsSource=L1;

感谢阅读,并为我糟糕的英语表示歉意。

因为您在xml中有多个主题
s\u subject
应该是
主题的
列表

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>()
);
doc.Elements(“学生”)。选择(
x=>
s_id=(字符串)x.Element(“学生id”),
s_name=(字符串)x.Element(“学生名”),
s_subject=x.元素(“主题”).元素(“主题”)
.选择(s=>s.Element(“学校主题”).值)
托利斯先生()
);

根据您的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; }
}
公共班级学生
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共列表主题{get;set;}
}
公共课科目
{
公共字符串名称{get;set;}
}
这里是解析。要填写get学生的科目,您需要执行子查询:

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()
    };
XDocument xdoc=XDocument.Load;
数不清的学生=
来自xdoc.后代中的s(“学生”)
选择新学生()
{
Id=(int)s.Element(“student_Id”),//您可以强制转换为int
Name=(string)s.Element(“学生名”),
Subjects=s.Element(“Subjects”)//下面是子查询
.要素(“主体”)
.Select(subj=>newsubject(){
名称=(字符串)主题元素(“学校主题”)
})托利斯先生()
};
顺便说一句,我认为您可以使用简单的字符串来保存主题名称-您实际上不需要类来保存主题名称