c#XmlReader:从起始元素

时间:2017-01-15 11:32:23

标签: c# xml deserialization xmlreader

我正在尝试将游戏状态保存在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的所有概念。在阅读有关节点和节点阅读器时我感到很困惑,所以如果可能的话,我想避免它们。只是属性,元素和内容。

1 个答案:

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