2011-12-10 83 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(); }