簡體   English   中英

LINQ to XML:如何選擇下一個元素

[英]LINQ to XML: How to select the next element

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

<plist version="1.0">
  <dict>
    <key>barcodes</key>
    <array>
      <string>JF893J89FJ-66666</string>
      <string>JF893J89FJ-55555</string>
    </array>
    <key>currentStep</key>
    <integer>1</integer>
    <key>dateFinished</key>
    <date>2010-05-10T18:33:25Z</date>
    <key>dateStarted</key>
    <date>2010-05-10T18:33:25Z</date>
    <key>description</key>
    <string>TEST</string>
    <key>geoRequired</key>
    <string>N</string>
    <key>inProgress</key>
    <string>N</string>
    <key>jobID</key>
    <integer>10085</integer>
    <key>jobSteps</key>
    <array>
      <dict>
        <key>label</key>
        <string>TEST</string>
        <key>response</key>
        <string>matt hudson</string>
        <key>stepID</key>
        <integer>1103</integer>
        <key>typeID</key>
        <integer>4</integer>
      </dict>
    </array>
  </dict>
</plist>

我需要在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<XElement>().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將是單個數組節點還是一系列數組節點,具體取決於您是否使用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 <key>jobSteps</key>
                    .OfType<XElement>() // 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM