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