2009-08-03 16 views
2

J'essaie d'analyser les résultats de l'API YouTube. J'obtiens les résultats correctement comme une chaîne, mais je suis incapable de l'analyser correctement.Utilisation de LINQ to XML pour traiter XML dans plusieurs espaces de noms

J'ai suivi les suggestions sur un sujet précédent, mais je n'obtiens aucun résultat.

Mon exemple de code est:

string response = youtubeService.GetSearchResults(search.Term, "published", 1, 50); 
XDocument xDoc = XDocument.Parse(response, LoadOptions.SetLineInfo); 
var list = xDoc.Descendants("entry").ToList(); 
var entries = from entry in xDoc.Descendants("entry") 
       select new 
       { 
        Id = entry.Element("id").Value, 
        Categories = entry.Elements("category").Select(c => c.Value) 
        //Published = entry.Element("published").Value, 
        //Title = entry.Element("title").Value, 
        //AuthorName = entry.Element("author").Element("name").Value, 
        //Thumnail = entry.Element("media:group").Elements("media:thumnail").ToList().ElementAt(0) 
       }; 
foreach (var entry in entries) 
{ 
    // entry.Id and entry.Categories available here 
} 

Le problème est que les entrées a un compte de 0, même si le XDocument a clairement les valeurs valides.

La valeur de la variable de réponse (XML exemple) peut être vu ici: http://snipt.org/lWm

(Pour votre information: Le schéma youTube est répertorié ici: http://code.google.com/apis/youtube/2.0/developers_guide_protocol_understanding_video_feeds.html)

Quelqu'un peut-il me dire ce que je fais mal ici?

+0

Votre premier problème était de ne pas afficher un exemple de l'échec XML. Je ne sais pas quel est votre deuxième problème, à cause de votre premier problème. –

+0

Peut-être que votre deuxième problème est que vous n'avez pas défini de point d'arrêt dans la boucle foreach? Avez-vous essayé, ou avez-vous dépendu du débogueur? –

+0

Je risque de deviner que la réponse est "namespaces xml".Avez-vous un exemple xml? –

Répondre

7

Toutes les données se trouvent dans l'espace de noms "http://www.w3.org/2005/Atom"; vous devez utiliser tout au long:

XNamespace ns = XNamespace.Get("http://www.w3.org/2005/Atom"); 

...

from entry in xDoc.Descendants(ns + "entry") 
select new 
{ 
    Id = entry.Element(ns + "id").Value, 
    Categories = entry.Elements(ns + "category").Select(c => c.Value) 
    ... 
}; 

etc (non testé)

+0

Cela l'a réparé. Merci! Juste pour que je comprenne, pourquoi ai-je besoin d'ajouter l'espace de nom avant le nom de chaque élément. Puisque l'élément est simplement pas ou quelque chose ... Je suppose que si un espace de noms était nécessaire, je l'ajouterais une fois au XDocument seulement. – rksprst

+0

Puisque l'espace de noms est hérité, '' est dans le même espace de noms. Vous devez qualifier tout ce qui ne figure pas dans l'espace de nom par défaut. –

+0

L'un des éléments dont j'ai besoin est nommé: ... lorsque j'utilise entry.Element (ns + "media: group"), j'obtiens une erreur. Existe-t-il un moyen spécifique d'accéder à cet élément? – rksprst

2

Vous devez définir l'espace de noms.

Création d'un XName dans un espace de noms
Comme XML, un XName peut être dans un espace de noms, ou il peut être en aucun espace de noms.
Pour C#, l'approche recommandée pour créer un XName dans un espace de noms consiste à déclarer l'objet XNamespace, puis à utiliser le remplacement de l'opérateur d'addition.

http://msdn.microsoft.com/en-us/library/system.xml.linq.xname.aspx

3

Quand vous voyez prefix:name, cela signifie que name est dans l'espace de noms dont le préfixe a été déclaré comme prefix. Si vous regardez en haut du document, vous verrez un xmlns:media=something. Le something est l'espace de noms utilisé pour tout ce qui a le préfixe media.

Cela signifie que vous devez créer un XNamespace pour chacun des espaces de noms dont vous avez besoin de faire référence:

XNamespace media = XNamespace.Get("http://search.yahoo.com/mrss/"); 

puis utilisez media pour les noms dans cet espace:

media + "group" 

Les espaces de noms ce document sont:

xmlns="http://www.w3.org/2005/Atom" 
xmlns:app="http://www.w3.org/2007/app" 
xmlns:media="http://search.yahoo.com/mrss/" 
xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" 
xmlns:gd="http://schemas.google.com/g/2005" 
xmlns:gml="http://www.opengis.net/gml" 
xmlns:yt="http://gdata.youtube.com/schemas/2007" 
xmlns:georss="http://www.georss.org/georss"