2011-12-10 23 views
21

Si alguien puede explicar por qué aparece el error "Falta elemento raíz" cuando mi documento XML (imagen adjunta) tiene un elemento raíz, ganan un pony que dispara a los holgazanes de sus ojos."Error de elemento raíz" pero tengo un elemento raíz

enter image description here

Código:

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

Etiquetas para ser utilizado de la manera que está utilizando ellos ... cada etiqueta debe identificar el tema en cuestión ... – mtahmed

+0

alguna razón en particular que está utilizando 'XmlReader' aquí? – BrokenGlass

+0

Soy totalmente nuevo para leer XML en C# ... esa es probablemente la razón por la que estoy usando XmlReader. No entiendo muy bien qué significa mtahmed. – DanTonyBrown

Respuesta

42

Su problema se debe a esta línea:

xml = reader.ReadToEnd(); 

Esto posiciona la corriente lector hasta el final para que cuando se ejecuta XmlReader.Create, hay nada queda en la corriente para que lea.

Si necesita que se rellene la secuencia xml, debe cerrar y volver a abrir el lector antes de XmlReader.Create. De lo contrario, eliminar o comentar esta línea resolverá su problema.

+0

Respuesta correcta, gracias :) – DanTonyBrown

+0

@DanTonyBrown: Me alegro de poder ayudar. Recuerde hacer clic en la marca de verificación y en la flecha hacia arriba al lado de cualquier respuesta que resuelva o lo ayude a resolver su problema para que los futuros visitantes de la pregunta sepan que esto funcionó para usted. –

+0

Si conociera XML mejor, tal vez * Sería * el que conseguiría un caballo que disparó láser;) –

4

Restablezca la posición de la secuencia de base cada vez que se lee si desea leer desde el principio como se dijo anteriormente, pero no debe tener que volver a crear la secuencia cada vez.

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

terminé creando una pequeña función rápida para hacer referencia antes de cada nueva 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; 
    } 
} 

Así que cuando estoy trabajando en XML que llaman justo antes de crear mi lector. Siempre tengo el mismo flujo en la memoria y nunca lo vuelvo a crear. No se supone que

ResetStream(); 
using (XmlReader reader = XmlReader.Create(m_stream)) { reader.Read(); } 
Cuestiones relacionadas