2011-12-10 9 views
21

Jeśli ktoś może wyjaśnić, dlaczego otrzymuję komunikat "Brak elementu głównego", gdy mój dokument XML (dołączony obraz) ma element główny, to wygrywa kucyka który odpala lazer z jego oczu."Brak elementu głównego", ale mam element główny

enter image description here

Kod:

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

Etykiety nie powinny być wykorzystywane w sposób, w jaki są używane ... każdy znacznik powinien określać temat w pytaniu ... – mtahmed

+0

jakiś szczególny powód używasz 'XmlReader' tutaj? – BrokenGlass

+0

Jestem całkowicie nowy do czytania XML w C# ... to jest prawdopodobnie powód, dla którego używam XmlReader. Nie do końca rozumiem, co oznacza mtahmed? – DanTonyBrown

Odpowiedz

42

Twój problem wynika z tej linii:

xml = reader.ReadToEnd(); 

To pozycjonuje strumień czytnika do końca tak, że kiedy XmlReader.Create jest wykonywany, jest nic nie pozostało w strumieniu, żeby go przeczytać.

Jeśli chcesz, aby ciąg znaków xml został wypełniony, musisz zamknąć i ponownie otworzyć czytnik przed XmlReader.Create. W przeciwnym razie usunięcie lub skomentowanie tej linii rozwiąże problem.

+0

Prawidłowa odpowiedź, dzięki :) – DanTonyBrown

+0

@DanTonyBrown: Cieszę się, że mogłem pomóc. Pamiętaj, aby kliknąć znacznik wyboru i strzałkę w górę obok dowolnej odpowiedzi, która rozwiązuje lub pomaga rozwiązać problem, aby przyszli użytkownicy tego pytania wiedzieli, że to zadziałało. –

+0

Gdybym znał XML lepiej, może * Byłbym * tym, który dostałby kucyka, który wystrzeliłby lasery;) –

4

Resetuj pozycję strumienia bazowego za każdym razem, gdy zostanie odczytana, jeśli chcesz odczytywać od początku, jak podano wcześniej, ale musisz nie trzeba ponownie tworzyć strumienia za każdym razem.

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

skończyło się tworząc krótki trochę funkcję referencyjnego przed każdym nowym 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; 
    } 
} 

Więc kiedy pracuję w xml nazywam go tuż przed tworzę czytelnika. Zawsze mam ten sam strumień w pamięci i nigdy go nie odtwarzam.

ResetStream(); 
using (XmlReader reader = XmlReader.Create(m_stream)) { reader.Read(); } 
Powiązane problemy