2013-03-12 94 views
1

我的XML代碼出現問題,它似乎無法保存,並且在打印出來時什麼也沒有發生。我不知道什麼是錯的,因爲它會加載到我的列表框但它會加載不正確。代碼如下,我的XML讀取的目的是將值存儲在列表中,然後獲取選定的標記並將其添加到列表框中。XML值不會讀取到字符串

String workingDir = Directory.GetCurrentDirectory(); 

XmlTextReader textReader = new XmlTextReader(workingDir + @"\XML.xml"); 
textReader.Read(); 
XmlNodeType type; 

while (textReader.Read()) 
{ 
    textReader.MoveToElement(); 
    type = textReader.NodeType; 
    if (type == XmlNodeType.Text) 
    { 

     if (textReader.Name == "Code") 
     { 
      textReader.Read(); 
      code = textReader.Value; 
      Console.WriteLine(code); 
     } 
     if (textReader.Name == "Name") 
     { 
      textReader.Read(); 
      name = textReader.Value; 
      Console.WriteLine(name); 
     } 
     if (textReader.Name == "Semester") 
     { 
      textReader.Read(); 
      semester = textReader.Value; 
      Console.WriteLine(semester); 
     } 
     if (textReader.Name == "Prerequisite") 
     { 
      textReader.Read(); 
      preReq = textReader.Value; 
      Console.WriteLine(code); 
     } 
     if (textReader.Name == "LectureSlot") 
     { 
      textReader.Read(); 
      lSlot = textReader.Value; 
      Console.WriteLine(lSlot); 
     } 
     if (textReader.Name == "TutorialSlot") 
     { 
      textReader.Read(); 
      tSlot = textReader.Value; 
      Console.WriteLine(tSlot); 
     } 
     if (textReader.Name == "Info") 
     { 
      textReader.Read(); 
      info = textReader.Value; 
      module.Add(new modules(name, code, semester, tSlot, lSlot, info, preReq)); 
     } 
    } 

    foreach (object o in module) 
    { 
     modules m = (modules)o; 
     String hold = m.mName; 
     selectionBox.Items.Add(hold); 
    } 
} 
+0

這將有助於瞭解什麼類型的對象textReader是。它顯然不是一個TextReader,但它是什麼不明確。 – Jeff 2013-03-12 20:44:16

+0

那麼,如果沒有你輸入的XML文件,告訴你有點難。我會建議在調試器中運行代碼,並查看出現錯誤的地方並理解原因。 – 2013-03-12 20:44:39

+0

我已經添加了我的XML文件的安裝以供您考慮 – user2157179 2013-03-12 20:47:03

回答

2

的事情是,你找type == XmlNodeType.Text,但文本節點沒有任何名字,沒有文本節點將匹配textReader.Name == "Code"

您需要將type == XmlNodeType.Element中最後一個節點的textReader.Name存儲在變量中,並在找到XmlNodeType.Text節點時使用存儲的名稱。

0

我認爲最可能的原因是在你的每條if語句中,你使用的是textReader.Read()。對於大多數Reader s這將讀取下一個項目,而不是當前。

正如其他答案所述,您需要查看Name的元素,然後讀取該值。

考慮這樣的事情,而不是:

while (textReader.Read()) 
    { 
     textReader.MoveToElement(); 
     type = textReader.NodeType; 
     if (type == XmlNodeType.Element) 
     { 
      textReader.Read(); 
      switch(textReader.Name) 
      { 
       case "Code": 
        code = textReader.Value; 
        break; 
       case "Name": 
        name = textReader.Value; 
        break; 
       //SNIP 
       case "Info": 
        info = textReader.Value; 
        module.Add(new modules(name, code, semester, tSlot, lSlot, info, preReq)); 
        break; 
       default: 
        //Whatever you do here 
        break; 
      } 
      Console.WriteLine(textReader.Value); 
     } 
     foreach (object o in module) 
     { 
      modules m = (modules)o; 
      String hold = m.mName; 
      selectionBox.Items.Add(hold); 
     } 


    } 

這樣你的XmlTextReader僅讀每次迭代一個節點,你有少了很多,如果檢查 - 這是一個開關的情況下設計的局面。