Linq2XML查询问题(不接受名称中的':')

时间:2010-08-12 11:40:40

标签: c# linq-to-xml

我有一个xml文件,其中包含以下元素:

<rs:data>
<z:row entry='*.@foo.de' type='1'/>

我需要使用Linq2Xml访问它们。我的问题是,我得到一个例外情况告诉我 “:”符号不能在名称中使用。

我的Linq2Xml查询是:

var rowQuery = from Mail in whiteMails.Descendants("xml").Descendants("rs:data").Descendants("z:row")
                       select Mail;

我该如何处理?

1 个答案:

答案 0 :(得分:1)

rs:data是属于命名空间的元素的名称。 “rs”是名称空间前缀,“data”是本地名称。根据您上面的评论,rs前缀是为名称空间URI“urn:schemas-microsoft-com:rowset”声明的。这意味着您的元素被标识为具有本地名称“data”和名称空间URI“urn:schemas-microsoft-com:rowset”的元素。在LINQ to XML中,所有名称都需要完全由其命名空间限定(它也是XML的工作原理)。在代码中,这是通过使用XNamespace和XName类来完成的。例如:

XNamespace rsNamespace = XNamespace.Get("urn:schemas-microsoft-com:rowset");
XNamespace zNamespace = XNamespace.Get("#RowsetSchema");
var rowQuery = from Mail in whiteMails.Elements("xml")
                                      .Elements(rsNamespace + "data")
                                      .Elements(zNamespace + "row")
               select Mail;

请注意,我使用的是Elements而不是Descendants。 (后代也会起作用)。后代将在您调用它的元素的整个子树中以任何深度返回指定名称的所有元素。元素将返回具有该名称的所有直接孩子。从您的XML和查询中,您似乎想要直接的孩子。 元素也比后代快得多,因为它只需要超越直接的孩子,而不是整个子树。