2012-11-02 95 views
0

可能重複:
Understanding Linq To Xml - Descendants return no results的LINQ to XML節點選擇預期不起作用

所以我一直在尋找的微軟例如:

http://msdn.microsoft.com/en-us/library/bb387061.aspx

在那裏,他們這樣做:

IEnumerable<string> partNos = 
from item in purchaseOrder.Descendants("Item") 
select (string) item.Attribute("PartNumber"); 

他們使用「後代」來處理purchaseOrder中的一個實際上3層深的項目。

現在,當我嘗試用我的XML做同樣的事情時,我什麼也得不到。

我的XML:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<name>Roulette</name> 

<modules> 
    <module>application</module> 
    <module>test</module> 
</modules> 

我的代碼:

XDocument mainPOM = XDocument.Load(above_xml); 
List<string> pomLocations = (from loc in mainPOM.Descendants("module") select (string)loc.Name.LocalName).ToList(); 
Console.WriteLine(pomLocations.Count); 

不幸的是,pomLocations爲0 :(長度

有人可以告訴我究竟在何處我在搞亂嗎?

回答

1

你的根元素包含此:

xmlns="http://maven.apache.org/POM/4.0.0" 

這是設定的後代元素和它本身的默認命名空間。所以元素的名稱不僅僅是「項目」 - 它是該項目中的「項目」。你想:

XNamespace ns = "http://maven.apache.org/POM/4.0.0"; 
var locations = mainPOM.Descendants(ns + "project") 
         .Select(...); 

我已經離開了Select條款爲「...」我不認爲你真的想loc.Name.LocalName,這將永遠是‘項目’憑藉查詢。如果project是根元素,爲什麼不使用mainPOM.Root

+0

嗨,喬恩,謝謝你的回答! :)。其實,我想選擇節點的內部。但那是臨時代碼,只是爲了選擇* something *,任何東西。順便說一句,它不管用。我只是在我現有的代碼中添加ns,長度仍然是0 :: - /。想法?至於後代。我想要它,因爲我實際上正在尋找「模塊」節點。再次,它只是一些測試代碼。我會編輯它。 – Axonn

+0

好吧,現在它工作。我用「模塊」替換了「項目」。看來ns +「project」返回0個項目。 ns +「模塊」返回了預期的2.謝謝。 – Axonn

+0

@Axonn:那麼'mainPOM'是什麼?如果它已經是'project'元素,那就可以解釋它。這是提供一個簡短的但完整的程序來展示程序的幫助 - 你基本上已經離開了我們的猜測。 –