我有一个XML文件和一个显示文件数据的ListBox。
XML文件是:
<students>
<student>
<id>1</id>
<data>
<subject name="Geopraphy" status="passed" />
<subject name="History" status="passed" />
</data>
<student>
<students>我想在listbox1中显示的是学生的id,如果被选中,我希望在另一个ListBox (listbox2)中显示该学生的所有主题。这是codeI到目前为止拥有的:
XmlDocument xm = new XmlDocument();
string list = "//id";
xm.Load("data.xml");
XmlNodeList Xn = xm.SelectNodes(list);
foreach (XmlNode xNode in Xn)
{
listBox1.Items.Add(xNode.InnerText);
}如何填写listbox2?
发布于 2014-02-05 12:44:32
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
XmlNode nodes = xDoc.SelectSingleNode(String.Format("/students/student[id={0}]/data", listBox1.SelectedItem));
foreach (XmlNode node in nodes.ChildNodes)
{
if (node.Attributes["status"].Value == "passed")
listBox2.Items.Add(node.Attributes["name"].Value);
}
}发布于 2014-02-05 12:21:38
首先,我建议您使用Linq到Xml来解析xml (如果可能的话,也可以使用Xml序列化)。第二,我建议创建一个包含学生和学科数据的班级:
public class Student
{
public int Id { get; set; }
public List<Subject> Subjects { get; set; }
}
public class Subject
{
public string Name { get; set; }
public string Status { get; set; } // enum or boolean is better
}然后解析来自xml的学生,并将他们映射到UI,而不是使用UI中的xml:
var xdoc = XDocument.Load("students.xml");
var students = xdoc.Root.Elements("student")
.Select(st => new Student {
Id = (int)st.Element("id"),
Subjects = st.Element("data")
.Elements("subject")
.Select(s => new Subject {
Name = (string)s.Attribute("name"),
Status = (string)s.Attribute("status")
}).ToList()
}).ToList();然后,您可以将学生绑定到列表框:
listBox1.DisplayMember = "Id";
listBox1.DataSource = students;并在选定的学生更改时,在listbox2中显示主题:
listBox2.DisplayMember = "Name";
listBox2.DataSource = selectedStudent.Subjects;发布于 2014-02-05 12:19:29
您试过xpath吗?
/students/student[@id=1]/data/subject其中1是在listbox1中选择的值。
您可以在http://msdn.microsoft.com/en-us/library/d271ytdx(v=vs.110).aspx中看到一个示例
编辑:添加了处理的listbox1_selectedIndex事件
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) {
if (listBox1.SelectedIndex != -1) {
string path = String.Concat("/students/student[@id=", listBox1.SelectedItem, "]/data/subject");
FillListbox2(xm, path);
}
}在您的代码中,您需要将XDocument作为表单中的属性移动
https://stackoverflow.com/questions/21576929
复制相似问题