2014-10-10 113 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