2017-12-05 13 views
0

私のコードは以下の通りです。私が使用したxmlファイルはhereです。xmlファイルをC#で1行ずつ読むと、逆出力となります

using System; 
using System.Text; 
using System.Xml; 

namespace ReadingAnXMLFile 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      XmlReader xmlReader = XmlReader.Create("D:/C#/GameAssets/Images/alienExplode/images/alienExplode.xml"); 
      while (xmlReader.Read()) 
      { 
       Console.Write(xmlReader.Name); 
       while (xmlReader.MoveToNextAttribute()) // Read the attributes. 
        Console.Write(" " + xmlReader.Name + " = '" + xmlReader.Value + "' "); 
       Console.WriteLine(" "); 
      } 
      Console.ReadKey(); // wait for keyboard input to exit 
     } 
    } 
} 

このプログラムの出力は、xmlファイルのデータの逆順です。私のコンソール出力が

SubTexture name = 'explosion0000.png' x = '180' y = '474' width = '24' height = '25' 

これがなぜ起こるかどれidearであるのに対し、例えば、xmlファイルの行は

<SubTexture height="25" width="24" y="474" x="180" name="explosion0000.png"/> 

を示して?

+1

から

私はあなたのXMLファイルを開き、ラインがコンソール出力と同じであることを見た: '<サブテクスチャ名= "explosion0000.png" X = "180" Y = "474" width = "24" height = "25" /> ' 出力はOKのようです。しかし、[MSDNの例](https://msdn.microsoft.com/en-us/library/4k1h0k3e.aspx)を参照することをお勧めします。 – Didgeridoo

+0

はい、逆の順序です。 J_Kayの答えはそれを解決しました。ありがとう。 – emorphus

答えて

2

。 XML属性の性質は、それらが順序に依存しないということです。その期待を念頭に置いて設計する必要があります。 MSDN:

public override bool MoveToNextAttribute() { 
      if (!IsInReadingStates() || nodeType == XmlNodeType.EndElement) 
       return false; 
      readerNav.LogMove(curDepth); 
      readerNav.ResetToAttribute(ref curDepth); 
      if (readerNav.MoveToNextAttribute(ref curDepth)) { 
       nodeType = readerNav.NodeType; 
       if (bInReadBinary) { 
        FinishReadBinary(); 
       } 
       return true; 
      } 
      readerNav.RollBackMove(ref curDepth); 
      return false; 
     } 
1

thisによると、XML属性の順序は重要ではないため、MoveToNextAttribute()の順番は任意です。彼らはMoveToNextAttribute()でループしながら属性を削除できるように、その方向を選択している可能性があります。順序が問題になる場合は、この操作を行うことができます。MoveToNextAttribute()の実際の実装は、最初の最後の(最も深い)要素を返す、再帰的である

for (int i = 0; i < xmlReader.AttributeCount; i++) //or (int i = xmlReader.AttributeCount - 1; i >= 0; i--) for the reverse order 
{ 
    xmlReader.MoveToAttribute(i); 
    //... 
} 
+0

実際にはうまくいくかもしれませんが、仕様によって保証されているかどうかは疑問です。一般的なルールは、XMLパーサは属性を任意の順序で提供するということです。 –

関連する問題