我熟悉OrderBy linq扩展方法,但似乎无法让我的查询返回任何结果 - 在使用Linq和XElement方法玩了很长一段时间后才能找到子元素的属性!
我已经构建了一个Xelements列表,其中包含以下内容,例如数据:
+ [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
正如您所看到的,根标签可以是&lt;插入&gt;或者&lt;已删除&gt;。我的查询很简单(尽管我的要求!):我需要按c元素的r属性排序,这样列表的第一个或第三个元素应该先排序(值为&lt; cr =“A2 “&gt ;,然后按列表中的第二个元素排序(&lt; cr =”A7“&gt;)
对于简单的qeustion感到抱歉,但我花了一个小时至少尝试使用语法!
编辑:我认为我正在努力处理我的流畅查询,因为rowData元素与根目录有不同的名称空间(只是猜测,因为我没有使用xml的经验)。我会尝试从该元素中删除ns,因为它并不重要并继续尝试,但欢迎任何帮助答案 0 :(得分:0)
正如我早期的EDIT所说,这实际上是由于XML中的命名空间不同,导致我在寻找元素等方面感到非常痛心。
我通过在SO
上找到的递归方法将它们全部剥离了答案 1 :(得分: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。