[英]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.