2014-10-10 61 views
0

在没有实际输入'数学','physics'或'technologija'的情况下使用SelectSingleNode以便我可以使用任何条目阅读它吗?使用XmlDocument节点列表读取XML文件

到目前为止,阅读是这样的:

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; 
       ... 

而且,由于有“晚报”和“天”的学生,我应该使用其他节点列表/的foreach(XmlNodeList nodelist = xd.SelectNodes("/students/Evening");)读他们,或者我可以以某种方式结合/students/Eveningstudents/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> 
+0

我建议使用XDocument来给你访问linq。这也是你的XML或者你的XML结构可以改变。它不是你的问题,我错了,它的xml结构留下了许多不足之处。 – DidIReallyWriteThat 2014-10-10 17:31:51

+0

XML不会改变(至少结构不会,但可能会有更多的学生)。我不得不使用所有东西。然而,我不知道的是,我应该如何选择节点的“数学”和“物理学”而不真正知道它们的名称(不能输入SelectSingleNode(“physics”); – GytisK 2014-10-10 17:34:52

+0

@Calvin Smith Linq是不错的选择,但是,在之前的VS C#版本中没有... – umlcat 2014-10-10 19:13:37

回答

0

是的,你可以用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 
+0

你真棒:)感谢您的详细回答。但是,您可以使用XmlDocument和NodeList来选择“grades/*/grade2”吗? – GytisK 2014-10-11 15:46:01

+0

您可以在XmlDocument文档或单个节点上运行SelectNodes。要在NodeList上运行,使用foreach进行迭代,如上所示。 – 2014-10-14 13:27:14

1

不知道是不是我的问题是太不清楚或东西,但我终于找到了如何正确地做到这一点:

首先,让我模块1使用tc.module1 = n.FirstChild.Name; ,第二个:tc.module2 = n.LastChild.Name;

但是,我认为这并不是真正的“正确”做事方式。

+0

没错,有几种方法可以做同样的事情,查看我的其他答案 – umlcat 2014-10-10 19:13:59