【问题标题】:c# XmlReader: reading attributes from start elementc# XmlReader:从开始元素读取属性
【发布时间】: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 XMLXmlSerializer 反序列化您的 XML 要容易得多。对于后者,您可以将您的 XML 上传到 xmltocsharp.azurewebsites.net 并让它为您生成 c# 类。
  • 我通常把数据放到一个DataTable中,这样使用ReadXML()和WriteXML()方法读取和写入变得非常简单。

标签: c# xml deserialization xmlreader


【解决方案1】:

在你执行reader.ReadStartElement("level")你的读者移动到“级别”之后的下一个元素,到“计数”,它没有预期的属性。 (在此处查找文档: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);
}

【讨论】:

    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 2019-03-08
    • 2014-05-31
    • 2016-10-18
    • 2013-06-06
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多