使用XMLTextReader将XML读入Windows窗体

时间:2013-12-28 14:25:16

标签: c# xml winforms visual-studio

这是我的XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!--This is an XML Generated File-->
<Subjects>
  <Subject>
    <Name>CG</Name>
    <TotalLectures>25</TotalLectures>
    <AttendedLectures>20</AttendedLectures>
  </Subject>
  <Subject>
    <Name>ISM</Name>
    <TotalLectures>40</TotalLectures>
    <AttendedLectures>37</AttendedLectures>
  </Subject>
</Subjects>

我需要阅读这些元素(Name,TotalLectures,AttendedLectures)并将它们显示在3个单独的文本框中。但我无法取得成果。

我正在使用XMLTextReader,因为Linq到XML,XPath和其他似乎有点复杂。

这是我能得到的最接近的(使用StackOverflow上另一个问题的帮助):

XmlTextReader reader = new XmlTextReader("xmldata.xml");
                reader.Read();
                while (reader.Read())
                {
                    if (reader.Name == "Name")
                    {
                        textBox1.Text = reader.ReadString();
                    }
                    if (reader.Name == "TotalLectures")
                    {
                        textBox2.Text = reader.ReadString();
                    }
                    if (reader.Name == "AttendedLectures")
                    {
                        textBox3.Text = reader.ReadString();
                    }
                }

但这并没有正确显示主题的细节。我真的需要为我的项目工作! :S

1 个答案:

答案 0 :(得分:0)

我假设当用户选择主题时,存储在变量中的主题ID称为SubjectId。然后,您可以使用带有LINQ的XDocument执行以下操作:

var doc = XDocument.Load("xmldata.xml");
var subjectNode = doc.Descendants("Name").FirstOrDefault(o => o.Value == SubjectId).Parent;
textBox1.Text = subjectNode.Element("Name").Value;
textBox2.Text = subjectNode.Element("TotalLectures").Value;
textBox3.Text = subjectNode.Element("AttendedLectures").Value;
  • doc.Descendants("Name")将返回标记为“Name”的所有元素,然后
  • .FirstOrDefault(o => o.Value == SubjectId)会过滤以前的结果,只返回Value等于SubjectId的第一个元素,如果找不到匹配的元素,则返回null,然后
  • .Parent将返回父元素 - 本例中为主题标记 - 前一个结果元素 - 名称标记 - 。因此subjectNode将包含用户所选主题的主题标记。