我的代码如下。我使用的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'
为什么会发生这种情况?
答案 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()