使用XmlTextReader循环遍历具有相同名称的XML属性

时间:2012-12-02 22:03:35

标签: c# xml

我正在使用XmlTextReader做一些练习代码。我已经编写了一些非常基本的XML,如下所示:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<task name="mixed_sprite_task_test">
    <sprite>
        <type>animatedSprite</type>
        <id>0</id>
        <name>animatedSprite</name>
        <fileName>iyezoz</fileName>
        <startingPositionX>200</startingPositionX>
        <startingPositionY>200</startingPositionY>
        <sheetSizeX>12</sheetSizeX>
        <sheetSizeY>35</sheetSizeY>
        <startingFrameX>0</startingFrameX>
        <startingFrameY>0</startingFrameY>
        <startingState>standing</startingState>
        <movementSpeed>15</movementSpeed>
        <frameDelay>0.055</frameDelay>
    </sprite>
    <sprite>
        <type>staticSprite</type>
        <id>0</id>
        <name>staticSprite</name>
        <fileName>Super_Mario_63</fileName>
        <startingPositionX>0</startingPositionX>
        <startingPositionY>0</startingPositionY>
    </sprite>
    <sprite>
        <type>simpleSprite</type>
        <id>0</id>
        <name>simpleSprite</name>
        <fileName>imgres</fileName>
        <startingPositionX>100</startingPositionX>
        <startingPositionY>100</startingPositionY>
        <movementSpeed>15</movementSpeed>
    </sprite>
</task>

此文件显示我有task。在任务中我有3 sprite s。 在我的代码中,我想遍历每个sprite并收集信息。

我可以从第一个sprite获取数据而没有任何问题。是否有某种方法来循环使用具有相同名称的属性的xml?

感谢 - 你!

2 个答案:

答案 0 :(得分:4)

我更喜欢Linq2Xml。

var xDoc = XDocument.Parse(xmlstring); //or XDocument.Load(filename);
var sprites = xDoc.Descendants("sprite")
                .Select(s=>s.Elements()
                            .ToDictionary(e=>e.Name.LocalName,e=>(string)e))
                .ToList();

您可以将其用作

var type = sprites[0]["type"];

或者可以采取安全行动

string delay;
if (sprites[1].TryGetValue("frameDelay", out delay))
{
    Console.WriteLine(delay);
}

答案 1 :(得分:2)

您可以选择名为“sprite”的所有节点

  var myXml = new XmlDocument();
  myXml.Load(myDocument);
  XmlNode rootElement = myXml.DocumentElement;
  foreach (XmlNode item in rootElement.SelectNodes(@"/task/sprite"))
  {
      // do stuff with node        
  }