2017-01-15 10 views
2

xmlファイルにゲームの状態を保存しようとしています。プレイヤーがゲームをロードするときに復元できるようにします。私はXMLにまったく新しいものですが、XmlWriterを使ってxmlファイルにゲームの状態を格納することができました。このファイルを読むときに問題が発生します。それが必要としての要素は、ファイルの末尾に閉じているc#XmlReader:開始要素から属性を読み取る

<?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()メソッドを追加した後、レベル要素が見つかりました。しかし、私がreader.GetAttribute("width")を使用したとき、私はwidth属性を取得せず、空白を取得しました。したがって、3:settings.IgnoreWhitespace = trueを追加しました。私は空白をもう得られませんが、見知らぬ人でもあります。私は "幅"属性ではなく、 "カウント"要素を読んだ。

1:{なし}

2:{空白、値= "\ nの

これらの読者は前の段落(Visual Studioのデバッグウィンドウから読む)の各点のために持っていた値であります"}

3:{要素、バリュー=" 回数 "}

私はその点3は私のような何か与えるだろうと予想:{属性、値=" 幅 "}または似たような。

なぜ、読者は属性を読み上げませんが、次の要素ですか?誰かがXMLファイルから属性とコンテンツをどのように読み込むべきかの簡単なステップバイステップの例を教えてもらえますか?

私はxmlのすべての概念を学ぶにはあまり時間がないので、できるだけシンプルにしています。 NodesとNodeReaderについて読むと非常に混乱しています。可能であれば、私はそれらを避けたいと思います。ちょうど属性、要素、およびコンテンツ。

+1

を(多くMB)あなたはそれがはるかに簡単に使用することができます[LINQにXML](https://msdn.microsoft.com/en-us/library/mt693062.aspx)または['XmlSerializer'](https://msdn.microsoft.com/en-us/library/182eeyhh(v = vs.110).aspx)を使用してXMLを逆シリアル化します。後者の場合は、XMLをhttp://xmltocsharp.azurewebsites.net/にアップロードして、C#クラスを生成させることができます。 – dbc

+0

私は通常、データをDataTableに入れて、ReadXML()メソッドとWriteXML()メソッドを使用して読み書きを非常に簡単にします。 – jdweng

答えて

2

reader.ReadStartElement("level")を実行した後、読者は「レベル」の後の次の要素に移動し、「カウント」には期待される属性はありません。 (ドキュメンタリーのためにここを見て:https://msdn.microsoft.com/library/y7e4769a(v=vs.110).aspx)あなたがシリアライズをこの方法を実行したい場合は、ちょうどこのラインremvoe:あなたのXMLファイルが巨大である場合を除き

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); 
} 
関連する問題