2010-08-12 42 views
0

我有已下列元素的XML文件:Linq2XML查詢問題(不接受「:」在名稱)

<rs:data> 
<z:row entry='*[email protected]' type='1'/> 

我需要通過使用Linq2Xml來訪問它們。我的問題是,我收到一個異常,告訴我 ':'符號不能在名稱中使用。

我Linq2Xml查詢是:

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

我如何處理?

+0

在XML中我認爲:是用來指向一個特定的命名空間,這就是爲什麼它不能被使用,我猜。在根元素中是否存在xmlns:rs或xmlns:z屬性?嘗試只搜索「數據」或「行」,看看是否有效。否則,如果你創建了這樣的名稱,你可能不得不改變。 – 2010-08-12 13:35:41

+0

是的,我發現,這是一個命名空間...我已經定義,就像 \t的xmlns:RS = '甕:架構 - 微軟COM:行集' \t的xmlns:Z = '#RowsetSchema' 很好,但我不知道如何處理它們:( 如果我只是尋找「數據」或「行」它找不到任何東西 – darkdog 2010-08-12 14:17:29

+0

是的我不確定我自己,如何Descendendts(「數據」)。其中(D => D .NameSpaceURI ==「thenamepsace」).Descend ...... – 2010-08-12 14:30:20

回答

1

rs:數據是屬於名稱空間的元素的名稱。 「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; 

請注意,我使用了元素而不是後代。 (後代也會工作)。後代將在您調用它的元素的整個子樹中以任意深度返回指定名稱的所有元素。元素將僅返回具有該名稱的所有直接子女。從你的XML和查詢看來,你似乎想要直接的孩子。 元素比子孫快得多,因爲它只需要覆蓋直接的子元素,而不是整個子樹。

+0

哇,非常非常好的描述:) :)非常感謝你,它的工作原理 – darkdog 2010-08-13 09:08:06