我正在尝试将游戏状态保存在xml文件中,以便在玩家加载游戏时可以恢复它。我是xml的新手,但我确实设法使用XmlWriter
成功地将游戏状态存储在xml文件中。当我尝试读取此文件时出现问题。
这是我的程序创建的文件的开头:
<?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.
}
}
我不断得到的例外是width属性的值为null
或格式错误。
1:之前我没有使用reader.MoveToContent()
方法,我发现当我执行reader.ReadStartElement()
时,读者没有读到“级别”。读者没有价值。 2:添加reader.MoveToContent()
方法后,确实找到了level元素。但是,当我使用reader.GetAttribute("width")
时,我没有获得width属性,而是获得空格。因此,3:我添加了settings.IgnoreWhitespace = true
。我不再获得空白,但更奇怪的是。我没有读过“width”属性,而是“count”元素。
这些是读者对上一段中每个点的值(从visual studio调试窗口中读取):
1:{无}
2:{空白,值=“\ n”}
3:{Element,Value =“count”}
我预计第3点会给我一些类似的东西:{Attribute,Value =“width”}或类似的东西。
为什么读者不读取属性,而是读取下一个元素?有人可以给我一个简单的分步示例,说明如何读取xml文件中的属性和内容吗?
我尽量让事情变得简单,因为我没有多少时间学习xml的所有概念。在阅读有关节点和节点阅读器时我感到很困惑,所以如果可能的话,我想避免它们。只是属性,元素和内容。
答案 0 :(得分:2)
执行reader.ReadStartElement("level")
后,您的读者移动到&#34; level&#34;之后的下一个元素,到#34; count&#34;,它没有预期的属性。 (在这里查看文档:{{3}})如果你想以这种方式进行序列化,只需要删除这一行:
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);
}