“Root element is missing”错误,但我有一个根元素。

28

如果有人能解释为什么我的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 有什么特别的原因吗? - BrokenGlass
жҲ‘е®Ңе…ЁдёҚжҮӮеҰӮдҪ•еңЁC#дёӯиҜ»еҸ–XML...иҝҷеҸҜиғҪжҳҜжҲ‘дҪҝз”ЁXmlReaderзҡ„еҺҹеӣ гҖӮжҲ‘дёҚеӨӘжҳҺзҷҪmtahmedзҡ„ж„ҸжҖқжҳҜд»Җд№Ҳпјҹ - dannybrown
3个回答

45

你的问题出在这一行代码:

xml = reader.ReadToEnd();

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

如果需要填充xml字符串,则需要在XmlReader.Create之前关闭并重新打开读取器。否则,删除或注释掉这行代码将解决您的问题。


1
@DanTonyBrown:很高兴我能帮到你。请记得点击任何解决或帮助你解决问题的答案旁边的勾选标记和向上箭头,以便未来访问该问题的访客知道这对你有用。 - competent_tech
如果我更了解XML,也许我就能得到一只发射激光的小马了 ;) - Adam Rackis
@competent_tech 我需要等待时间限制到期才能将您标记为正确答案 :) - dannybrown
2
你可以把我的小马送给任何有意于世界统治的需要帮助的孩子。 - competent_tech
这是翻译后的文本:我之前添加了调试代码读取OuterXml的值,以便查看其值,但忘记了它,并且在被其他事情分心后回到项目时没有意识到它会重新定位阅读器。 - neminem

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接