【问题标题】:Linq to XML orderby child elementLinq to XML orderby 子元素
【发布时间】:2016-03-09 13:14:04
【问题描述】:

我有以下 XML 代码:

<dsPreventieRegisterItem xmlns="http://tempuri.org/dsPreventieRegisterItem.xsd">
  <tblpreventieregisteritem>
    <DatumInterventie>2015-06-14</DatumInterventie>
    <TijdstipInterventie>11:30</TijdstipInterventie>
    <HulpverlenerNaam>Vandenbroucke</HulpverlenerNaam>
    <HulpverlenerVoornaam>Dirk</HulpverlenerVoornaam>
    <HulpbehoefteAard>Vinger en pols bezeerd </HulpbehoefteAard>
    <HulpbehoefteOorzaak>Ronddraaiende delen</HulpbehoefteOorzaak>
    <GebodenHulp>aanbrengen van Cold pack </GebodenHulp>
    <GebruikteMiddelen>Cold pack Ice spray Steunverband</GebruikteMiddelen>
    <Opmerkingen />
    <id>1</id>
  </tblPreventieRegisterItem>
</tblpreventieregisteritem>

但有多个 tblPreventieRegisterItem 元素。 这是在 XElement 中声明的。

然后我想把它放在IEnumerable&lt;XElement&gt; 列表中。 我遇到的问题是 orderby 永远不会起作用。

IEnumerable <XElement> items =
        from el in root.Elements("tblpreventieregisteritem")
        orderby Int32.Parse(el.Element("id").Value) descending
        select el;

谁有想法?

【问题讨论】:

  • never works 你的意思是它没有正确排序还是收到错误消息?
  • 它没有正确排序。它在我的转发器中获取我的列表,但没有排序。

标签: c# xml linq


【解决方案1】:

这是 XML 主题中的 FAQ(常见问题)。 XML 中的所有元素都在 默认命名空间 中,URI 是 "http://tempuri.org/dsPreventieRegisterItem.xsd"。您可以使用XNamespace+ element's local-name 的组合来引用命名空间中的元素,例如:

XNamespace d = "http://tempuri.org/dsPreventieRegisterItem.xsd";

IEnumerable <XElement> items =
        from el in root.Elements(d+"tblpreventieregisteritem")
        orderby (int)el.Element(d+"id") descending
        select el;

请注意,您可以将XElement 直接转换为int,这是一种更简洁更安全 的方法,即如果找不到相关的XElement


working demo example :

var xml = @"<dsPreventieRegisterItem xmlns='http://tempuri.org/dsPreventieRegisterItem.xsd'>
  <tblpreventieregisteritem>
    <id>1</id>
  </tblpreventieregisteritem>
  <tblpreventieregisteritem>
    <id>2</id>
  </tblpreventieregisteritem>
  <tblpreventieregisteritem>
    <id>3</id>
  </tblpreventieregisteritem>
</dsPreventieRegisterItem> ";
var root = XElement.Parse(xml);
XNamespace d = "http://tempuri.org/dsPreventieRegisterItem.xsd";

IEnumerable<XElement> items =
    from el in root.Elements(d + "tblpreventieregisteritem")
    orderby (int)el.Element(d + "id") descending
    select el;

foreach (var item in items)
{
    Console.WriteLine(item.Element(d + "id").ToString());
}

输出:

<id xmlns="http://tempuri.org/dsPreventieRegisterItem.xsd">3</id>
<id xmlns="http://tempuri.org/dsPreventieRegisterItem.xsd">2</id>
<id xmlns="http://tempuri.org/dsPreventieRegisterItem.xsd">1</id>

【讨论】:

  • 我的列表还没有排序。
  • @Niels 从发布的演示中学习。或者创建您自己的 dotnetfiddle 演示,使用最少的代码演示您的问题
【解决方案2】:

你试过这个吗:

        XNamespace ns = "http://tempuri.org/dsPreventieRegisterItem.xsd";

        IEnumerable<XElement> items =
        from rootElement in root.Elements("{" + ns + "}" + "dsPreventieRegisterItem")
        from el in rootElement.Elements("{" + ns + "}" + "tblpreventieregisteritem")
        orderby Int32.Parse(el.Element("{" + ns + "}" + "id").Value) descending
        select el;

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多