【问题标题】:"Root element is missing" error but I have a root element“缺少根元素”错误,但我有一个根元素
【发布时间】:2011-12-10 02:38:12
【问题描述】:

如果有人能解释为什么我的 XML 文档(附图片)有根元素时会出现“缺少根元素”错误,那么他们赢得了一匹小马,它的眼睛会发射激光。

代码:

if (ISF.FileExists("Players.xml"))
{
    string xml;
    using (IsolatedStorageFileStream rawStream = ISF.OpenFile("Players.xml", FileMode.Open))
    {
        StreamReader reader = new StreamReader(rawStream);
        xml = reader.ReadToEnd();
          XmlReaderSettings settings = new XmlReaderSettings { IgnoreComments = true, IgnoreWhitespace = true };
        XmlReader xmlReader = XmlReader.Create(reader, settings);
         while (xmlReader.Read())
        {
            switch (xmlReader.NodeType)
            {
                case XmlNodeType.Element:
                    switch (xmlReader.Name)
                    {
                        case "numberOfPlayers":
                            string nodeValue = xmlReader.ReadContentAsString();
                            int NODEVALUE = int.Parse(nodeValue);
                            MessageBox.Show(" " + NODEVALUE);
                            break;
                    }
                    break;
            }
            break;
        }
        reader.Close();
    }
}

【问题讨论】:

  • 您在这里使用XmlReader的任何特殊原因?
  • 我对在 C# 中读取 XML 完全陌生...这可能是我使用 XmlReader 的原因。我不太明白 mtahmed 是什么意思?

标签: c# xml


【解决方案1】:

你的问题是由于这一行:

xml = reader.ReadToEnd();

这会将读取器流定位到末尾,以便在执行 XmlReader.Create 时,流中没有任何内容可供读取。

如果您需要填充xml 字符串,则需要在XmlReader.Create 之前关闭并重新打开阅读器。否则,删除或评论此行将解决您的问题。

【讨论】:

  • @DanTonyBrown:很高兴我能帮上忙。请记住单击任何解决或帮助您解决问题的答案旁边的复选标记和向上箭头,以便该问题的未来访问者知道这对您有用。
  • 如果我更了解 XML,也许我会得到一匹发射激光的小马;)
  • @competent_tech 我需要等待时限到期才能将您标记为正确答案:)
  • 你可以把我的小马送给任何想要统治世界的贫困儿童。
  • Durp,这就是我所做的:我之前添加了调试代码来读取 OuterXml,所以我可以看到它的值是什么,忘记了它,并且没有意识到当我重新定位阅读器时在被其他事情分心后,后来又回到了这个项目。
【解决方案2】:

如果您想如前所述从头开始读取,则在每次读取时重置基本流的位置,但您不必每次都重新创建流。

String xmlResource = Assembly.GetExecutingAssembly().GetName().Name + ".XML.IODeleter.xsd";
configXsd = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(xmlResource));
if (configXsd != null)
  {
    configXsd.BaseStream.Position = 0;

    File.WriteAllText(apppath + @"\" + Assembly.GetExecutingAssembly().GetName().Name + ".XML.IODeleter.xsd", configXsd.ReadToEnd());
  }

【讨论】:

    【解决方案3】:

    我最终在每个新的 XmlReader 之前创建了一个快速的小函数以供参考...

    private void ResetStream()
    {
        /*
        The point of this is simply to open the stream with a StreamReader object
        and set the position of the stream to the beginning again.
        */
    
         StreamReader reader = new StreamReader(m_stream);
    
         if (reader != null)
        {
            reader.BaseStream.Position = 0;
        }
    }
    

    所以当我使用 xml 时,我会在创建阅读器之前调用它。我在内存中总是有相同的流并且从不重新创建它。

    ResetStream();
    using (XmlReader reader = XmlReader.Create(m_stream)) { reader.Read(); }
    

    【讨论】:

      猜你喜欢
      • 2012-04-24
      • 2013-11-26
      • 2016-05-10
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多