【发布时间】:2017-05-30 08:38:54
【问题描述】:
我正在尝试将游戏的状态保存在 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()时发现reader没有读到“level”。读者没有价值。 2:添加reader.MoveToContent()方法后,确实找到了关卡元素。但是,当我使用reader.GetAttribute("width") 时,我没有得到宽度属性,而是一个空格。因此,3:我添加了settings.IgnoreWhitespace = true。我不再得到空白,但更奇怪的是。我没有读到“width”属性,而是“count”元素。
这些是读者对上一段中每个点的值(从 Visual Studio 调试窗口读取):
1:{无}
2: {空白, 值="\n "}
3: {Element, Value="count"}
我预计第 3 点会给我类似:{Attribute, Value="width"} 或类似的东西。
为什么阅读器不是读取属性,而是读取下一个元素?谁能给我一个简单的分步示例,说明如何从 xml 文件中读取属性和内容?
我尽量保持简单,因为我没有太多时间来学习 xml 的所有概念。在阅读 Nodes 和 NodeReaders 时我很困惑,所以如果可能的话,我想避免它们。只是属性、元素和内容。
【问题讨论】:
-
除非您的 XML 文件很大(很多 MB),否则您会发现使用 LINQ to XML 或
XmlSerializer反序列化您的 XML 要容易得多。对于后者,您可以将您的 XML 上传到 xmltocsharp.azurewebsites.net 并让它为您生成 c# 类。 -
我通常把数据放到一个DataTable中,这样使用ReadXML()和WriteXML()方法读取和写入变得非常简单。
标签: c# xml deserialization xmlreader