使用c#逐行读取xml文件会产生反向输出

时间:2017-12-05 19:47:18

标签: c# xml

我的代码如下。我使用的xml文件是here

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文件中的数据的顺序相反。例如,xml文件行显示

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

而我的控制台输出是

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

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

MoveToNextAttribute()的实际实现是递归的,它首先返回最后一个(最深的)元素。 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 :(得分:1)

根据this,XML属性顺序并不重要,因此<img border="0" style="background:url(https://i.imgur.com/ML9NHOA.jpg) no-repeat; width:727px; height:484px" src="https://i.imgur.com/Zp8a50J.jpg" width="727" height="484" />顺序是任意的。他们可能已选择该方向,以便您可以在使用MoveToNextAttribute()循环时删除属性。如果订单对您很重要,您可以这样做:

MoveToNextAttribute()