2010-11-16 16 views
1

Voici le code pour récupérer la valeur dans la balise de contenu:LINQ to XML: Problème avec deux points dans les balises xml

var returnVerse = from item in xmlTreeVerse.Descendants("rss").Elements("channel").Elements("item") 
           select new VerseModel 
           { 
            Verse = item.Element("content").Value, 
            Url = "" 
           }; 

Voici le fichier XML:

<?xml version="1.0" ?> 
<rss version="2.0" 
        xmlns:dc="http://purl.org/dc/elements/1.1/" 
        xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" 
        xmlns:admin="http://webns.net/mvcb/" 
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
        xmlns:content="http://purl.org/rss/1.0/modules/content/"> 

    <channel> 
    <title>text</title> 
    <link>text</link> 
    <item> 
     <title>text</title> 
     <content:encoded> 
     Text 
     </content:encoded> 
    </item> 
    </channel> 
</rss> 

Je ne peux pas interroger "content: encoder" car il n'est pas valide pour interroger l'opérateur ":". S'il vous plaît aider.

Répondre

0

Au lieu de

item.Element("content").Value 

Essayez ceci:

item.Element(XName.Get("encoded", "content")).Value 

Si item.Element() renvoie Null là, vous devrez peut-être utiliser à la place:

item.Element(XName.Get("encoded", "http://purl.org/rss/1.0/modules/content/")).Value 
+0

Oui, cela n'a pas fonctionné. Le deuxième paramètre de XName.Get est pour l'espace de noms. – contactmatt

+0

Ah, oups ... bien, échangez-les. :) (Je vais modifier ma réponse pour le faire.) – cdhowie

4

Ce "opérateur du côlon" est un espace de noms. Vous devez aussi interroger avec un espace de nom. Utiliser les namespace comme ceci:

XNamespace content = XNamespace.Get("http://purl.org/rss/1.0/modules/content/"); 
Verse = item.Element(content + "encoded").Value 
1

Cela a fonctionné pour moi, donc cartographiés revenir à content:encoded pour cette question

var ns = XNamespace.Get(@"http://purl.org/rss/1.0/modules/content/"); 

var xelems = xmlDoc.Descendants().ToList(); 

nodes.ForEach(n => n.Element(XName.Get("encoded", ns.NamespaceName)).Value); 

var elems = from x in xelems 
    select x.Element(XName.Get("encoded", ns.NamespaceName)).Value 

Si vous voulez tester rapidement cela fonctionne sur un flux RSS public, exécutez ce code dans une application de la console ou sur LinqPad ici sur Gist.