"L'élément racine est manquant erreur", mais j'ai un élément racine
si quelqu'un peut expliquer pourquoi j'obtiens une erreur "Root element is missing" quand mon document XML (image attached) a un élément root, il gagne un pony qui tire 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();
}
}
3 réponses
Votre problème est dû à cette ligne:
xml = reader.ReadToEnd();
cela positionne le lecteur stream à la fin de sorte que lorsque XmlReader.Create
est exécuté, il n'y a plus rien dans le flux pour pour lire.
si vous avez besoin de la xml
chaîne à être peuplée, alors vous devez fermer et rouvrir le lecteur avant XmlReader.Create
. Sinon, supprimer ou commenter cette ligne résoudra votre problème.
réinitialiser la position du flux de base chaque fois qu'il est lu si vous voulez lire depuis le début comme indiqué précédemment, mais vous il faut 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 de référence rapide 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;
}
}
donc quand 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 de ne jamais recréer.
ResetStream();
using (XmlReader reader = XmlReader.Create(m_stream)) { reader.Read(); }