XML值不会读取为字符串

时间:2013-03-12 20:41:48

标签: c# xml winforms listbox

我的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);
    }
}

2 个答案:

答案 0 :(得分:2)

问题在于您查找type == XmlNodeType.Text,但文本节点没有任何名称,没有文本节点与textReader.Name == "Code"匹配。

您需要将textReader.Nametype == XmlNodeType.Element的最后一个节点存储到变量中,并在找到XmlNodeType.Text节点时使用存储的名称。

答案 1 :(得分:0)

我认为最可能的原因是,在每个if语句中,您使用的是textReader.Read()。对于大多数Reader,这将读取下一个项目,而不是当前项目。

正如另一个答案所说,你需要查看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每次迭代只读取一个节点,如果检查你就会少得多 - 这就是交换机案例设计的情况。