1

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

2 回答 2

2

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

您需要textReader.Name从最后一个节点开始存储type == XmlNodeType.Element变量,并在找到XmlNodeType.Text节点时使用存储的名称。

于 2013-03-12T20:47:54.717 回答
0

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

正如另一个答案所说,您需要查看元素,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 每次迭代只读取一个节点,并且您的 if 检查要少得多——这就是 switch case 设计的情况。

于 2013-03-12T20:52:30.500 回答