2016-05-11 6 views
0

私はOrderBy linq拡張メソッドに精通していますが、LinqとXElementメソッドを使ってかなり長い間再生した後にクエリを返すようには思えません。子要素!あなたは>ルートタグが<を挿入することができます>または<が削除された見ることができるように属性値でXElementのリストを並べ替えます

+  [0] {<Inserted> 
<rowData ID="A7-6A-1B-0A-19-44-BF-0A-79-63-7D-AA-12-62-54-98" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
    <c r="A2"> 
    <v>61108</v> 
    </c> 
    <c r="B2" t="s"> 
    <v>7</v> 
    </c> 
    <c r="C2"> 
    <v>1000111</v> 
    </c> 
    <c r="D2" t="s"> 
    <v>8</v> 
    </c> 
    <c r="E2"> 
    <v>200</v> 
    </c> 
    <c r="F2" t="s"> 
    <v>9</v> 
    </c> 
    <c r="G2" t="s"> 
    <v>10</v> 
    </c> 
</rowData> 
</Inserted>} System.Xml.Linq.XElement 
+  [1] {<Inserted> 
<rowData ID="6F-78-AB-C2-E9-8E-94-E7-18-96-97-DA-84-9C-E3-4C" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
    <c r="A7"> 
    <v>611025</v> 
    </c> 
    <c r="B7" t="s"> 
    <v>11</v> 
    </c> 
    <c r="C7"> 
    <v>61004</v> 
    </c> 
    <c r="D7" t="s"> 
    <v>12</v> 
    </c> 
    <c r="E7"> 
    <v>40</v> 
    </c> 
    <c r="F7" t="s"> 
    <v>10</v> 
    </c> 
    <c r="G7" t="s"> 
    <v>10</v> 
    </c> 
</rowData> 
</Inserted>} System.Xml.Linq.XElement 
+  [2] {<Deleted> 
<rowData ID="CA-B9-3B-71-B9-FE-35-11-FF-AA-12-A7-24-96-09-9A" xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"> 
    <c r="A2"> 
    <v>61008</v> 
    </c> 
    <c r="B2" t="s"> 
    <v>7</v> 
    </c> 
    <c r="C2"> 
    <v>1000111</v> 
    </c> 
    <c r="D2" t="s"> 
    <v>8</v> 
    </c> 
    <c r="E2"> 
    <v>200</v> 
    </c> 
    <c r="F2" t="s"> 
    <v>9</v> 
    </c> 
    <c r="G2" t="s"> 
    <v>10</v> 
    </c> 
</rowData> 
</Deleted>} System.Xml.Linq.XElement 

私は、次の例のデータが含まれているXelementsのリストを構築しました。私の質問は簡単です(私の質問にもかかわらず!):私は、リストの最初または3番目の要素を最初に注文しなければならないように、c要素のr属性で注文する必要があります(値< cr = "A2" >、その後、リストの2番目の要素(< CR =「A7」>)

シンプルqeustionのため申し訳ありません

が注文したが、私は、少なくとも構文で再生しようと時間を費やしてきた!

EDIT :私は私の流暢なクエリとは、rowData要素がルートとは異なる名前空間を持っているという事実のために苦労していると思います(私はxmlでの作業経験がないので推測します)。それは重要ではないし、試してみてくださいどんな助けも歓迎です

+1

試したことを投稿できますか? – sstan

+0

私をテストしますか?リスト orderedList = finalList.OrderBy(x => x.Element(sourceDoc.Name.NamespaceName + "c")。FirstAttribute.Value).ToList(); – notsoobvious

+0

注文の観点からは、各「」セクションの最初の「」要素のみを気にしますか?それとも、この要素を細かくして、後続の要素も使用したいのですか? –

答えて

0

私の以前のEDITが示唆したように、これは、など

要素を見つけることに私の大規模な心痛を引き起こし、原因XML内の異なる名前空間に実際にあった私は正式にSO

0

で見つかった再帰的なメソッドを介してそれらをすべて剥奪あなたは、それぞれあなたの例で定義されたノードを参照してくださいXElementオブジェクトのコレクションを持っていたら、各ノードの最初の子孫に基づいて発注による策略のビットを行うことができる必要があります:

// This pulls the first <c> descendant node and reads it value 
var ordered = unordered.OrderBy(n => (n.DescendantNodes().ElementAt(1) as XElement)?.FirstAttribute?.Value); 

これはおそらく可能性適切な質問を通じて劇的に改善されるすなわち、<c>の要素をターゲットにして、単純に最初の要素を使用しますが、これはうまくいくはずで、seen in action hereです。

関連する問題