Подтвердить что ты не робот

Ошибка "Корневой элемент отсутствует", но у меня есть корневой элемент

Если кто-нибудь может объяснить, почему я получаю ошибку "Корневой элемент отсутствует", когда мой XML-документ (прикрепленный к изображению) имеет корневой элемент, они выигрывают пони, который запускает лазеров с глаз.

enter image description here

код:

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

Ответ 1

Ваша проблема связана с этой строкой:

xml = reader.ReadToEnd();

Это позиционирует поток читателя до конца, так что, когда выполняется XmlReader.Create, в потоке ничего не остается для чтения.

Если вам нужна строка xml, которую нужно заполнить, вам нужно закрыть и снова открыть читатель до XmlReader.Create. В противном случае удаление или комментирование этой строки поможет решить вашу проблему.

Ответ 2

Reset позиция базового потока каждый раз, когда он читается, если вы хотите читать с начала, как указано ранее, но вы не должны каждый раз воссоздавать поток.

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

Ответ 3

В итоге я создал небольшую функцию для ссылки перед каждым новым 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;
    }
}

Поэтому, когда я работаю в xml, я называю это до того, как создаю своего читателя. У меня всегда есть тот же поток в памяти и никогда не воссоздайте это.

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