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 usedtc.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进行迭代,如上所示。