【问题标题】:Order a list of XElement by attribute value按属性值对 XElement 列表进行排序
【发布时间】:2016-05-11 14:38:56
【问题描述】:

我熟悉 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

如您所见,根标签可以是。 我的查询很简单(尽管我问了!):我需要按 c 元素的 r 属性排序,以便列表的第一个或第三个元素应该首先排序(值 ,然后按列表中的第二个元素排序 ()

编辑:我认为我在处理流畅的查询时遇到了困难,因为 rowData 元素与根的命名空间不同(只是猜测,因为我没有使用 xml 的经验)。我会尝试从该元素中删除 ns,因为它并不重要并继续尝试,但欢迎提供任何帮助

【问题讨论】:

  • 您可以发布您尝试过的内容吗?
  • 测试我?当然我会用例如编辑帖子: List orderedList = finalList.OrderBy(x => x.Element(sourceDoc.Name.NamespaceName + "c").FirstAttribute.Value).ToList();
  • 从排序的角度来看,您只关心每个&lt;rowData&gt; 部分的第一个&lt;c&gt; 元素吗?或者您是否希望它也能渗透并使用后续元素?
  • @RionWilliams 嗨,Rion,只有第一个就足够了 :)

标签: c# xml linq


【解决方案1】:

正如我之前的 EDIT 所建议的,这实际上是由于 XML 中的命名空间不同,导致我在查找元素等时非常心痛。

我通过 SO 上的递归方法适当地剥离了它们

【讨论】:

    【解决方案2】:

    一旦你有一个 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);
    

    这可能会通过适当的查询得到显着改善,即定位&lt;c&gt;元素并简单地使用第一个元素,但这应该可以工作并且可以是seen in action here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多