gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:24:18 25 4
gpt4 key购买 nike

我在解析多个 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 这样的简单字段,但是当同一个字段多次重复时,我不知道该怎么做:/这是我解析的源代码。

我做了两个类:

  • 包含学校科目名称的科目
  • 包含 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;

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

最佳答案

根据您的 xml,学生可以有多个科目。因此,您需要将科目集​​合作为学生的属性(property):

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

顺便说一句,我认为您可以使用简单的字符串来保存主题名称 - 您实际上并不需要类。

关于c# - 使用具有多个后代的 Linq 解析 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13904414/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com