从XML文件中填写列表框

时间:2014-02-05 12:11:40

标签: c# xml listbox

我有一个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?

4 个答案:

答案 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);
        }