2016-03-09 2 views
0

У меня есть следующий код XML:Linq для XML OrderBy дочернего элемента

<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<XElement>. Проблема, с которой я сталкиваюсь, заключается в том, что orderby никогда не работает.

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

У кого есть идеи?

+2

По _never works_ вы имеете в виду, что не делать правильно упорядочить или вы получаете сообщение об ошибке? – juharr

+0

Это не правильный порядок. Он получает мой список в моем ретрансляторе, но не заказывается. – Niels

ответ

2

Это вопрос (часто задаваемый вопрос) в теме XML. Все элементы вашего 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> 
+0

Мой список все еще не заказан. – Niels

+0

@Niels узнают из демонстрации. Или создайте свою собственную демонстрацию dotnetfiddle, которая продемонстрирует вашу проблему, используя минимальные коды – har07

0

Вы пробовали это один:

 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; 
Смежные вопросы