2013-03-12 73 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仅读每次迭代一个节点,你有少了很多,如果检查 - 这是一个开关的情况下设计的局面。