迭代具有特定索引

时间:2015-06-10 17:34:42

标签: c# xml linq xpath

我有一个XML文档,我试图从中提取数据。

<folder>
<list index="1">
<item index="1" >
<field type="IMAGE">
<url>https://www.test.com/0001.png</url>
</field>
</item>
<item index="2">
<field type="IMAGE">
<url>https://www.test.com/0002.png</url>
</field>
</item>
</list>

等...

我试图获取所有字段列表&#34; IMAGE&#34;在索引列表的内部1. xml中有多个列表,但它们有其他索引,但我只想从索引1的列表中提取那些列表。我该怎么办?

我试着这样做:

foreach (var list in xmlDoc.Descendants("list"))
{
   if (list.Attribute("index").Value == "1") // GET THE LIST
   {
       foreach (var field in list)
       {
           if (field.Attribute("type") != null && field.Attribute("type").Value == "IMAGE")
           {
               MessageBox.Show(field.Element("url").Value);
           }
       }
   }
}

但是这给了我一条错误信息:

  

错误2 foreach语句无法对类型变量进行操作   &#39; System.Xml.Linq.XElement&#39;因为&#39; System.Xml.Linq.XElement&#39;才不是   包含&#39; GetEnumerator&#39;

的公开定义

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

您尝试直接迭代元素,您需要迭代其后代字段元素,而不是:

foreach (var field in list)

你想:

foreach (var field in list.Descendants("field"))

尽管如此,更简单的方法是使用LINQ:

var urls = xmlDoc.Descendants("list")
    .Where(e => (int)e.Attribute("index") == 1)
    .Descendants("field")
    .Where(e => (string)e.Attribute("type") == "IMAGE")
    .Select(e => (string)e.Element("url"));

答案 1 :(得分:1)

因为问题有xpath标签:)

//list[@index="1"]//field[@type="IMAGE"]/url/text()