2011-12-10 124 views
21

如果任何人都可以解释为什么当我的XML文档(图像附加)有根元素时,我得到“根元素丢失”错误,他们赢得了一匹小马从它的眼睛里射出了火焰。“根元素丢失”错误,但我有一个根元素

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

标签不应该使用您使用的是他们的方式......每个标签应确定主题的问题... – mtahmed

+0

你在这里使用'XmlReader'什么特别的原因? – BrokenGlass

+0

我在C#中阅读XML时完全陌生......这可能是我使用XmlReader的原因。我不太明白mtahmed是什么意思? – DanTonyBrown

回答

42

你的问题是由于该行:

xml = reader.ReadToEnd(); 

,这样当执行XmlReader.Create这个位置读者流结束后,有它没有留在流中供它阅读。

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

+0

正确答案,谢谢:) – DanTonyBrown

+0

@DanTonyBrown:很高兴能帮到你。请记得点击任何解决问题或帮助您解决问题的答案旁边的复选标记和向上箭头,以便未来的问题访问者知道这对您有效。 –

+0

如果我更好地了解XML,可能*我会*成为一个发射激光的小马的人;) –

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