2010-11-10 4 views
1

J'essaye de construire une requête linq qui tire tous les nœuds qui ont un élément particulier.Xdocument, choisir les bons nœuds

Dans le cas ci-dessous, vous remarquerez que la deuxième entrée a quelques éléments supplémentaires: DisplayOnSignup, SortOrder, etc.

Je voudrais LINQ pour me donner tous les nœuds d'entrée qui ont un élément SortOrder .

Le doc xml ressemble à ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<feed > 
    <entry> 
     <link href="/ws/customers/testacct/lists/removed" rel="edit"></link> 
     <id>http://api.constantcontact.com/ws/customers/testacct/lists/removed</id> 
     <title type="text">Removed</title> 
     <updated>2010-11-10T19:03:09.253Z</updated> 
     <author> 
      <name>Test</name> 
     </author> 
     <content type="application/vnd.ctct+xml"> 
      <ContactList id="http://api.constantcontact.com/ws/customers/testacct/lists/removed"> 
       <Name>Removed</Name> 
       <ShortName>Removed</ShortName> 
      </ContactList> 
     </content> 
    </entry> 
    <entry> 
     <link href="/ws/customers/testacct/lists/1" rel="edit"></link> 
     <id>http://api.constantcontact.com/ws/customers/testacct/lists/1</id> 
     <title type="text">General Interest</title> 
     <updated>2010-11-10T19:03:09.253Z</updated> 
     <author> 
      <name>Constant Contact</name> 
     </author> 
     <content type="application/vnd.ctct+xml"> 
      <ContactList id="http://api.constantcontact.com/ws/customers/testacct/lists/1"> 
       <OptInDefault>true</OptInDefault> 
       <Name>General Interest</Name> 
       <ShortName>General Interest</ShortName> 
       <DisplayOnSignup>Yes</DisplayOnSignup> 
       <SortOrder>0</SortOrder> 
       <Members id="http://api.constantcontact.com/ws/customers/testacct/lists/1/members"></Members> 
       <ContactCount>3</ContactCount> 
      </ContactList> 
     </content> 
    </entry> 
</feed> 

Ma requête a l'air si bien que:

XDocument loaded = XDocument.Parse(response); 

result = (from entry in loaded.Descendants("entry") 
     select new CcList { 
      LinkHref = entry.Element("link").Attribute("href").Value, 
      Id = entry.Element("id").Value, 
      Title = entry.Element("title").Value, 
      Updated = entry.Element("updated").Value, 
      ListName = entry.Element("content").Element("ContactList").Element("Name").Value, 
      OptInDefault = entry.Element("content").Element("ContactList").Element("OptInDefault").Value, 
      ShortName = entry.Element("content").Element("ContactList").Element("ShortName").Value, 
      SortOrder = entry.Element("content").Element("ContactList").Element("SortOrder").Value 
     }).ToList<CcList>(); 

Qu'est-ce que je mets comme la clause where ou est-il une meilleure façon?

Répondre

3

Vous pouvez essayer:

var result = (
    from entry in loaded.Descendants("entry") 
    where entry.Descendants("SortOrder").Count() > 0 
    select new CcList { 
     LinkHref = entry.Element("link").Attribute("href").Value, 
     Id = entry.Element("id").Value, 
     Title = entry.Element("title").Value, 
     Updated = entry.Element("updated").Value, 
     ListName = entry.Element("content").Element("ContactList").Element("Name").Value, 
     OptInDefault = entry.Element("content").Element("ContactList").Element("OptInDefault").Value, 
     ShortName = entry.Element("content").Element("ContactList").Element("ShortName").Value, 
     SortOrder = entry.Element("content").Element("ContactList").Element("SortOrder").Value 
    } 
).ToList<CcList>(); 
+0

Et si j'aime ajouter tous les noeuds xml dans un Hashtable via node.Name? – Achilleterzo

3
XDocument loaded = XDocument.Parse(response); 

var result = (
      from entry in loaded.Descendants("entry") 
      where entry.Descendants().Any(x => x.Name == "SortOrder") 
      select new CcList { 
      LinkHref = entry.Element("link").Attribute("href").Value, 
      Id = entry.Element("id").Value, 
      Title = entry.Element("title").Value, 
      Updated = entry.Element("updated").Value, 
      ListName = entry.Element("content").Element("ContactList").Element("Name").Value, 
      OptInDefault = entry.Element("content").Element("ContactList").Element("OptInDefault").Value, 
      ShortName = entry.Element("content").Element("ContactList").Element("ShortName").Value, 
      SortOrder = entry.Element("content").Element("ContactList").Element("SortOrder").Value 
      }).ToList<CcList>(); 
+0

+1: Votre travail a aussi bien fonctionné .. Frederic était juste une minute plus vite .. Merci, – NotMe

+0

@Chris Lively: N'est-ce pas toujours le cas :) Heureux d'aider. – Sorax