2017-01-15 4 views
2

Я пытаюсь сохранить состояние игры в XML-файле, чтобы его можно было восстановить, когда игрок загружает игру. Я новичок в xml, но мне удалось успешно сохранить состояние игры в XML-файле, используя XmlWriter. Проблема возникает, когда я пытаюсь прочитать этот файл. Вот начало файла, как он создается моей программе:C# XmlReader: чтение атрибутов из начального элемента

<?xml version="1.0" encoding="utf-16"?> 
<level width="25" height="25"> 
    <count>0</count> 
    <row> 
    <tile type="ROOM" /> 
    <tile type="ROOM" /> 
    <tile type="ROOM" /> 
    <tile type="ROOM" /> 
    <tile type="ROOM" /> 
    <!-- More tiles and rows are defined, but the file is somewhat large to entirely copy-paste here--> 

элементы закрыты в конце файла, как это должно быть. Теперь я пытаюсь прочитать данные из этого файла с помощью объекта XmlReader:

public void LoadFromFile() 
    { 
     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.IgnoreWhitespace = true; 
     settings.IgnoreComments = true; 

     using(XmlReader reader = XmlReader.Create(new StreamReader("Content/Saves/SaveFile.xml", Encoding.UTF8), settings)) 
     { 
      reader.MoveToContent(); 
      reader.ReadStartElement("level"); 
      reader.MoveToAttribute("width"); 
      int w = int.Parse(reader.Value); 
      reader.MoveToNextAttribute(); 
      int h = int.Parse(reader.Value); 
      // More to be read when I understand this first part. 
     } 
    } 

Исключение я получаю то, что ширина атрибут либо имеет значение null или имеет неверный формат.

1: Раньше я не использовал метод reader.MoveToContent(), и я обнаружил, что читатель не читал «уровень», когда я выполнил reader.ReadStartElement(). Читатель не имел никакой ценности. 2: После добавления метода reader.MoveToContent() он нашел элемент уровня. Однако, когда я использовал reader.GetAttribute("width"), я не получил атрибут width, а пробел. Поэтому 3: я добавил settings.IgnoreWhitespace = true. Я больше не получаю пробел, но что-то еще страннее. Я не читал атрибут «width», а элемент «count».

Это те ценности, которые читатель имел для каждой точки в предыдущем пункте (чтение из визуального окна отладки студии):

1: {None}

2: {Пробелы, Value = "\ п "}

3: {Элемент, Value =" счетчик "}

Я ожидал, что пункт 3 дало бы мне что-то вроде: {Attribute, Value =" ширина "} или что-то подобное.

Почему читатель не читает атрибут, а следующий элемент? Может ли кто-нибудь дать мне простой пошаговый пример того, как следует читать атрибуты и содержимое из XML-файла?

Я стараюсь держать все как можно проще, так как у меня слишком мало времени, чтобы изучить все понятия для xml. Я очень смутился, читая о Nodes и NodeReaders, поэтому, если это возможно, я бы хотел их избежать. Просто атрибуты, элементы и контент.

+1

Если файл XML не огромны (многие MB) вам будет гораздо проще использовать [LINQ к XML] (https://msdn.microsoft.com/en-us/library/mt693062.aspx) или ['XmlSerializer'] (https://msdn.microsoft.com/en-us/library/182eeyhh (v = vs.110) .aspx) для десериализации вашего XML. Для последнего вы можете загрузить свой XML на http://xmltocsharp.azurewebsites.net/ и создать для него классы C#. – dbc

+0

Обычно я помещаю данные в DataTable, поэтому чтение и запись становятся очень простыми с использованием методов ReadXML() и WriteXML(). – jdweng

ответ

2

После выполнения команды reader.ReadStartElement("level") ваш читатель переходит к следующему элементу после «уровня», к «счету», который не имеет ожидаемых атрибутов. (Смотрите здесь доку: https://msdn.microsoft.com/library/y7e4769a(v=vs.110).aspx) Если вы хотите сделать сериализацию таким образом, просто remvoe этой строки:

using(XmlReader reader = XmlReader.Create(new StreamReader("Content/Saves/SaveFile.xml", Encoding.UTF8), settings)) 
{ 
    reader.MoveToContent(); 
    reader.MoveToAttribute("width"); 
    int w = int.Parse(reader.Value); 
    reader.MoveToNextAttribute(); 
    int h = int.Parse(reader.Value); 
} 
Смежные вопросы