C# 使用XmlDocument节点列表读取XML文件

C# 使用XmlDocument节点列表读取XML文件,c#,xml,object,xmldocument,nodelist,C#,Xml,Object,Xmldocument,Nodelist,有没有什么方法可以使用SelectSingleNode而不实际输入“math”、“physics”或“technomija”,这样我就可以用任何条目阅读它 到目前为止,阅读内容大致如下: XmlNodeList nodelist = xd.SelectNodes("/studentai/Evening"); foreach (XmlNode node in nodelist) { Student tc = new

有没有什么方法可以使用
SelectSingleNode
而不实际输入“math”、“physics”或“technomija”,这样我就可以用任何条目阅读它

到目前为止,阅读内容大致如下:

XmlNodeList nodelist = xd.SelectNodes("/studentai/Evening"); 
            foreach (XmlNode node in nodelist) 
            {
                Student tc = new Student(); 
                tc.id = node.Attributes.GetNamedItem("id").Value;        
                tc.name = node.Attributes.GetNamedItem("name").Value; 
                XmlNode n = node.SelectSingleNode("grades"); 
                tc.grade1 = n.ChildNodes.Item(0).InnerText; 
                ...
另外,既然有“晚间”和“日间”学生,我应该使用另一个nodelist/foreach(
XmlNodeList nodelist=xd.SelectNodes(“/students/Night”);
)来阅读它们,还是可以将
/students/Night
students/Day
组合起来

XML文件:

<?xml version="1.0" encoding="utf-8" ?> 
<students>

  <Evening id="36453" name="Petras">
    <grades>
      <math>
        <grade1>5</grade1>
        <grade2>7</grade2>
      </math>
      <technologija>
        <grade1>8</grade1>
        <grade2>4</grade2>
      </technologija>
    </grades>
    <average>6.00</average>
  </Evening>

  <Day id="75643" name="Jonas">
    <grades>
      <math>
        <grade1>8</grade1>
        <grade2>7</grade2>
      </math>
      <physics>
        <grade1>7</grade1>
        <grade2>10</grade2>
      </physics>
    </grades>
    <average>8</average>
  </Day>

  <Day id="48843" name="Andrius">
    <grades>
      <math>
        <grade1>5</grade1>
        <grade2>5</grade2>
      </math>
      <physics>
        <grade1>5</grade1>
        <grade2>7</grade2>
      </physics>
    </grades>
    <average>5.50</average>
  </Day>

  <Evening id="56442" name="Antanas">
    <grades>
      <math>
        <grade1>8</grade1>
        <grade2>8</grade2>
      </math>
      <technologija>
        <grade1>8</grade1>
        <grade2>10</grade2>
      </technologija>
    </grades>
    <average>8.50</average>
  </Evening>

</students>

5.
7.
8.
4.
6
8.
7.
7.
10
8.
5.
5.
5.
7.
5.50
8.
8.
8.
10
8.50

我不知道我的问题是否太不清楚,但我终于找到了正确的方法:

首先,获取module1 I used
tc.module1=n.FirstChild.Name,第二个:
tc.module2=n.LastChild.Name


然而,我认为这并不是一种真正“正确”的方法。

是的,您可以使用XPath实现这一点

实际上,在变量或XML元素中永远不应该有计数器数字,但要使用现有的计数器数字,这(或类似的计数器数字)将适用于2个等级/科目

// First loop through each student
foreach( XmlElement ndStudent in xd.SelectNodes( "/students/Evening | /students/Day" ) {
  // Build your object from the data
  Student tc = new Student(); 
  tc.id = ndStudent.GetAttribute( "id" );       
  tc.name = ndStudent.GetAttribute( "id" );       

  // Add in the grades
  foreach( XmlElement ndGrade in ndStudent( "grades/*/grade1" ) ) {
    tc.grade1 = ndGrade.innerText;
  }

  // Add in the grades
  foreach( XmlElement ndGrade in ndStudent( "grades/*/grade2" ) ) {
    tc.grade2 = ndGrade.innerText;
  }
} // end of student loop

我建议改用XDocument来访问linq。这也是您的xml还是您的xml结构可以更改。我错的不是你的查询,而是xml结构还有很多需要改进的地方。xml不会改变(至少结构不会改变,但可能会有更多的学生)。我必须按原样使用所有节点。但是,我不知道如何在不知道节点名称的情况下选择节点“数学”和“物理”(不能输入SelectSingleNode(“物理”)@Calvin Smith Linq是个不错的选择。但是,在以前的VS C版本中不可用…对。有几种方法可以做同样的事情。检查我的其他答案。你太棒了:)谢谢你的详细答案。但是,您可以使用XmlDocument和节点列表执行类似“grades/*/grade2”的选择吗?您可以在XmlDocument文档或单个节点上运行SelectNodes。要在节点列表上运行,请使用foreach进行迭代,如上所示。