我有一个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)中显示该学生的所有主题。这是我到目前为止的代码:
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?
答案 0 :(得分:2)
首先 - 我建议您使用Linq to 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;
当所选学生改变后,在列表框2中显示主题:
listBox2.DisplayMember = "Name";
listBox2.DataSource = selectedStudent.Subjects;
答案 1 :(得分:1)
你试过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作为属性移动到
形式答案 2 :(得分:1)
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);
}
}
答案 3 :(得分:0)
我认为下面会帮助你
XmlDocument xm = new XmlDocument();
string list = "//data";
xm.Load("XMLFile1.xml");
XmlNodeList Xn = xm.SelectNodes(list);
foreach (XmlNode xNode in Xn)
{
listBox2.Items.Add(xNode.ChildNodes[0].Name.InnerText);
}