web-dev-qa-db-fra.com

Erreur "L'élément racine est manquant" mais j'ai un élément racine

Si quelqu'un peut expliquer pourquoi je reçois un message d'erreur «L'élément racine est manquant» lorsque mon document XML (image jointe) comporte un élément racine, il gagne un poney qui déclenche des lazers de ses yeux.

enter image description here

Code:

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

Votre problème est dû à cette ligne:

xml = reader.ReadToEnd();

Ceci positionne le flux de lecteur à la fin de sorte que, lorsque XmlReader.Create est exécuté, il ne reste plus rien dans le flux à lire.

Si vous souhaitez que la chaîne xml soit renseignée, vous devez fermer et rouvrir le lecteur avant le XmlReader.Create. Sinon, supprimer ou commenter cette ligne résoudra votre problème.

42
competent_tech

Réinitialisez la position du flux de base à chaque lecture si vous souhaitez lire depuis le début comme indiqué précédemment, mais vous ne - pas devez recréer le flux à chaque fois.

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

J'ai fini par créer une petite fonction rapide à référencer avant chaque nouveau 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;
    }
}

Ainsi, lorsque je travaille en XML, je l’appelle juste avant de créer mon lecteur. J'ai toujours le même flux en mémoire et ne le recrée jamais.

ResetStream();
using (XmlReader reader = XmlReader.Create(m_stream)) { reader.Read(); }
0
Arvo Bowen