2009-10-29 8 views
0

J'ai le code XML suivantespace de noms atome LINQ

<?xml version="1.0" encoding="UTF-8"?> 
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"> 
<entry><id><![CDATA[text]]></id>< 
author><name><![CDATA[film24]]></name></author><title><![CDATA[text]]></title> 
<updated>2009-10-30T15:55:13+00:00</updated><published>2009-10-30T00:00:00+00:00</published> 
<media:thumbnail type="image/jpeg" title="thumbnail" url=""/> 
<media:content type="video/flv" title="video" url="" expression="high"/> 
<media:content type="video/flv" title="video" url="" expression="low"/> 
</entry> 
</feed> 

Si je l'espace de noms suivant inclus je ne peux pas interroger le xml. c'est-à-dire qu'il ne renvoie aucun résultat.

http://www.w3.org/2005/Atom

Voici comment je le xml questionne

 XNamespace nsMedia = "http://search.yahoo.com/mrss/"; 
     XNamespace nsAtom = "http://www.w3.org/2005/Atom"; 

     string url = HttpContext.Current.Server.MapPath(ConfigHelper.GetValue("FeedUri")); 
     var feed = XElement.Load(url); 
     var posts = from c in feed.Descendants(nsAtom + "entry") 
        select new CDNEntry 
        { 
         Id = (string)c.Element(nsAtom + "id").Value, 
         Author = (string)c.Element(nsAtom + "author").Value, 
         Title = (c.Element("title") != null) ? (string)c.Element(nsAtom + "title").Value : "", 
         Summary = (c.Element("summary") != null) ? (string)c.Element(nsAtom + "summary").Value : "", 
         Thumbnail = (string)c.Element(nsMedia + "thumbnail").Attribute(nsAtom + "url").Value, 
         FLV = (string)c.Element(nsMedia + "content").Attribute(nsAtom + "url").Value, 
         Updated = DateTime.Parse((string)c.Element(nsAtom + "updated").Value), 
         Published = DateTime.Parse((string)c.Element(nsAtom + "published").Value) 
        }; 

     return posts.ToList(); 
+0

Avez-vous vérifié que uniqueUrl correspond à au moins une des entrées "id" element exactement? Dans un premier temps, je vous recommande de supprimer temporairement votre lambda afin d'isoler si le problème correspond à un identifiant ou un problème avec la structure de votre instruction linq. –

+0

salut ryan, ouais j'ai essayé ça. Pour clarifier cela ne fonctionne pas lorsque "xmlns =" ​​http://www.w3.org/2005/Atom "est inclus – frosty

Répondre

2

Votre exemple XML a été coupé au large, mais votre problème est plus probable que vous devez utiliser plusieurs espaces de noms. Essayez quelque chose comme ceci:

XNamespace nsMedia = "http://search.yahoo.com/mrss/"; 
XNamespace nsAtom = "http://www.w3.org/2005/Atom"; 

var feed = GetFeed(); 
var posts = from c in feed.Descendants(nsAtom + "entry") 
      where (string)c.Element(nsAtom + "id") == uniqueUrl 
      select new CDNEntry 
      { 
       Id = (string)c.Element(nsAtom + "id"), 
       Author = (string)c.Element(nsAtom + "author"), 
       Title = (string)c.Element(nsAtom + "title") ?? "", 
       Summary = (string)c.Element(nsAtom + "summary") ?? "", 
       Thumbnail = (string)c.Element(nsMedia + "thumbnail").Attribute("url"), 
       FLV = (string)c.Element(nsMedia + "content").Attribute("url"), 
       Updated = (DateTime)c.Element(nsAtom + "updated"), 
       Published = (DateTime)c.Element(nsAtom + "published") 
      }; 
+0

merci, vraiment apprécier votre réponse.Je suis sûr que votre droite.Je ne peux pas J'ai mis à jour mon code ci-dessus pour afficher tout le xml – frosty

+0

Vous êtes vraiment proche, vous avez juste besoin de supprimer les espaces de noms de l'attribut ("url"). Plutôt que d'utiliser la propriété Value, qui peut provoque des exceptions de référence nul comme vous voyez, je préfère tirer parti des différents lancements explicites fournis par XElement Casting to string renvoie simplement Value de toute façon, mais il renvoie simplement null si l'élément n'existe pas. (ou DateTime? pour prendre en charge les valeurs nulles) est plus propre que l'analyse syntaxique de la chaîne – dahlbyk

+0

cool, à droite, vous ne connaissiez pas l'opérateur "." C'est beaucoup plus propre. – frosty