LINQ to XML:如何选择下一个元素

我有一个iPhone应用程序的plist文件。 它如下所示:

  barcodes  JF893J89FJ-66666 JF893J89FJ-55555  currentStep 1 dateFinished 2010-05-10T18:33:25Z dateStarted 2010-05-10T18:33:25Z description TEST geoRequired N inProgress N jobID 10085 jobSteps   label TEST response matt hudson stepID 1103 typeID 4     

我需要在jobSteps之后获取数组。

到目前为止我有这个:

 XDocument xml = XDocument.Load(rri.Response); var q = from elements in xml.Descendants("plist").Descendants("dict") where elements.Value == "jobSteps" select elements; 

但我需要在其中包含jobSteps的元素之后获取下一个项目。

我不完全清楚Adam的解决方案是否符合您的要求,但如果没有,您可能需要查看NextNode属性:

获取此节点的下一个兄弟节点。

例如,这会打印数组元素:

 using System; using System.Linq; using System.Xml.Linq; class Test { static void Main() { XDocument doc = XDocument.Load("test.xml"); foreach (var element in doc.Descendants("key") .Where(x => (string) x == "jobSteps")) { Console.WriteLine(element.NextNode); } } } 

请注意,它正在跳过元素之间的空白 – 但是如果它与数组之间有任何文本,那么它将不起作用 – 所以你需要:

 Console.WriteLine(element.NodesAfterSelf().OfType().First()); 

编辑

我相信这会在jobSteps节点之后获得元素:

 XElement elementAfterJobsteps = xml.Descendants("plist").FirstOrDefault().Descendants("jobSteps").FirstOrDefault().ElementsAfterSelf().FirstOrDefault(); 

结束编辑

 foreach (XElement El in xml.Descendants("plist")) { var localResults = from elements in El.Descendants("dict") where elements.Value == "jobSteps" select elements; //process localResults } 

或者,甚至更简单,尝试方法语法

  foreach (XElement El in xml.Descendants("plist")) { var localResults = El.Descendants("dict").Where(dict => dict.Value == "jobSteps"); //process localResults } 
 var q = xml .Descendants("plist") .Descendants("dict") .Where(item => item.Value == "jobSteps") .Select(item => item.NextNode) .SingleOrDefault() // add this if you expect single match ; 

q将是单个arrays节点还是一系列arrays节点,具体取决于您是否使用SingleOrDefault()

 var q = (from key in xml.Descendants("key") where key.Value == "jobSteps" from array in xml.Descendants("array") select key.NodesAfterSelf() // In all nodes after jobSteps .OfType() // which are elements .Where(element => element.Name == "array") // and name is array, .First() // select first of them ).First(); // and select first of whatever is found 

注意:如果没有找到结果,上面的代码可能会在调用First()时抛出InvalidOperationException