2010-11-16 24 views
1

下面的代码来检索内容标签值:的LINQ to XML:问题与XML标签结肠

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

下面是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> 

我无法查询“content:encode”,因为查询“:”运算符无效。请帮忙。

回答

0

而不是

item.Element("content").Value 

试试这个:

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

如果item.Element()返回空在那里,你可能需要使用它代替:

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

是的,没有工作。 XName.Get的第二个参数是命名空间。 – contactmatt 2010-11-16 04:04:57

+0

啊,哎呀..好吧,换掉它们。 :)(我会编辑我的答案,这样做。) – cdhowie 2010-11-16 04:08:10

4

那个 “冒号操作” 是一个名字空间。您还需要使用命名空间进行查询。您可以使用命名空间是这样的:

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

这为我工作,所以映射回content:encoded这个问题

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 

如果你想快速测试这个工作在一个公共RSS提要,运行这段代码在控制台应用程序或LinqPad上在Gist这里。