Я пытаюсь сохранить состояние игры в 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, поэтому, если это возможно, я бы хотел их избежать. Просто атрибуты, элементы и контент.
Если файл 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
Обычно я помещаю данные в DataTable, поэтому чтение и запись становятся очень простыми с использованием методов ReadXML() и WriteXML(). – jdweng