c# XmlReader:从起始元素读取属性
c# XmlReader: reading attributes from start element
我正在尝试将游戏状态保存在 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"。 reader 没有任何价值。 2:添加reader.MoveToContent()
方法后,确实找到了关卡元素。但是,当我使用reader.GetAttribute("width")
时,我得到的不是width属性,而是一个空格。因此,3:我加了settings.IgnoreWhitespace = true
。我不再有空白,而是更奇怪的东西。我没有阅读 "width" 属性,而是 "count" 元素。
这些是 reader 对上一段中每个点的值(从 visual studio 调试 window 读取):
1:{None}
2:{空格,值="\n "}
3:{元素,值="count"}
我预计第 3 点会给我这样的信息:{Attribute, Value="width"} 或类似的信息。
为什么reader不读取属性,而是读取下一个元素?谁能给我一个简单的分步示例,说明如何从 xml 文件中读取属性和内容?
我尽量让事情变得简单,因为我没有足够的时间学习 xml 的所有概念。在阅读有关 Nodes 和 NodeReader 的内容时,我感到非常困惑,所以如果可能的话,我想避免使用它们。只是属性、元素和内容。
在您执行 reader.ReadStartElement("level")
之后,您的 reader 移动到 "level" 之后的下一个元素,到 "count",没有预期的属性。 (在此处查找文档:https://msdn.microsoft.com/library/y7e4769a(v=vs.110).aspx)如果您想以这种方式进行序列化,只需删除此行:
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);
}
我正在尝试将游戏状态保存在 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"。 reader 没有任何价值。 2:添加reader.MoveToContent()
方法后,确实找到了关卡元素。但是,当我使用reader.GetAttribute("width")
时,我得到的不是width属性,而是一个空格。因此,3:我加了settings.IgnoreWhitespace = true
。我不再有空白,而是更奇怪的东西。我没有阅读 "width" 属性,而是 "count" 元素。
这些是 reader 对上一段中每个点的值(从 visual studio 调试 window 读取):
1:{None}
2:{空格,值="\n "}
3:{元素,值="count"}
我预计第 3 点会给我这样的信息:{Attribute, Value="width"} 或类似的信息。
为什么reader不读取属性,而是读取下一个元素?谁能给我一个简单的分步示例,说明如何从 xml 文件中读取属性和内容?
我尽量让事情变得简单,因为我没有足够的时间学习 xml 的所有概念。在阅读有关 Nodes 和 NodeReader 的内容时,我感到非常困惑,所以如果可能的话,我想避免使用它们。只是属性、元素和内容。
在您执行 reader.ReadStartElement("level")
之后,您的 reader 移动到 "level" 之后的下一个元素,到 "count",没有预期的属性。 (在此处查找文档:https://msdn.microsoft.com/library/y7e4769a(v=vs.110).aspx)如果您想以这种方式进行序列化,只需删除此行:
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);
}