簡體   English   中英

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.
        }
    }

我不斷得到的例外是寬度屬性的值要么為null要么格式錯誤。

1:我之前沒有使用reader.MoveToContent()方法,我在執行reader.ReadStartElement()時發現reader沒有讀到“水平”。 讀者沒有價值。 2:添加reader.MoveToContent()方法后,確實找到了level元素。 但是,當我使用reader.GetAttribute("width") ,我沒有得到寬度屬性,而是一個空格。 因此,3:我添加了settings.IgnoreWhitespace = true 我不再有空格,而是更奇怪的東西。 我沒有閱讀“width”屬性,而是“count”元素。

這些是讀者對上一段中每個點的值(從 Visual Studio 調試窗口讀取):

1:{無}

2:{空格,值="\\n"}

3:{元素,值=“計數”}

我預計第 3 點會給我類似的東西:{Attribute, Value="width"} 或類似的東西。

為什么讀者不讀取屬性,而是讀取下一個元素? 有人可以給我一個簡單的分步示例,說明應該如何從 xml 文件中讀取屬性和內容?

我盡量讓事情變得簡單,因為我沒有時間學習 xml 的所有概念。 在閱讀 Nodes 和 NodeReaders 時,我很困惑,所以如果可能的話,我想避免使用它們。 只有屬性、元素和內容。

執行reader.ReadStartElement("level")您的閱讀器將移動到“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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM