“根元素缺失”错误,但我有一个根元素

时间:2011-12-10 02:38:13

标签: c# xml

如果有人能够解释为什么我的XML文档(图片附件)有根元素时会出现“Root element is missing”错误,他们就会赢得一只小马,从它的眼睛里激起了lazers。

enter image description here

代码:

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();
    }
}

3 个答案:

答案 0 :(得分:43)

你的问题是由于这一行:

xml = reader.ReadToEnd();

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

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

答案 1 :(得分:4)

如果您想要从前面开始阅读,请在每次读取时重置基本流的位置,但是每次都必须重新创建流。

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());
  }

答案 2 :(得分:0)

我最终创建了一个快速的小函数,以便在每个新的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(); }