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);
}