【问题标题】:XML values wont read to stringXML 值不会读取到字符串
【发布时间】:2013-02-28 14:02:14
【问题描述】:

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

【问题讨论】:

  • 了解 textReader 是什么类型的对象会有所帮助。它显然不是 TextReader,但不清楚它是什么。
  • 嗯,如果没有您输入的 XML 文件,这有点棘手。我建议在调试器中运行代码,看看哪里出了问题并了解原因。
  • 我已经添加了我的 XML 文件的安装供您考虑
  • 我强烈建议将您的示例压缩到相关的位。具体来说,您是否需要几乎相同的循环的这么多副本。 (我不知道它们是否重要,所以保持原样,因为这可能是格式问题)。

标签: c# xml winforms listbox


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为最可能的原因是在您的每个 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 的设计目的。

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      相关资源
      最近更新 更多