2010-12-06 63 views
0

我試圖讓LINQ的理解,和MSDN頁面上開始了:我的LINQ在這裏有什麼問題?做什麼的MSDN說,但

http://msdn.microsoft.com/library/bb308960.aspx#xlinqoverview_topic2f

在這裏,它引用了一些示例XML

<contacts> 
    <contact> 
    <name>Patrick Hines</name> 
    <phone type="home">206-555-0144</phone> 
    <phone type="work">425-555-0145</phone> 
    <address> 
     <street1>123 Main St</street1> 
     <city>Mercer Island</city> 
     <state>WA</state> 
     <postal>68042</postal> 
    </address> 
    <netWorth>10</netWorth> 
    </contact> 
    <contact>... 

並說下面將抽出一個「電話」元素列表:

XElement contacts = XElement.Load(@"C:\Projects\ALL_MY_PROJECTS\LINQ_Noodling\UI\Contacts.xml"); 
foreach (x in contact.Elements("phone")) { 
    Console.WriteLine(x); 
} 

這樣的:

<phone>206-555-0144</phone> 
<phone>425-555-0145</phone> 

除外。我什麼也沒得到。如果我用上面的「聯繫人」替換上面的「電話」,我會得到所有聯繫人(包括「姓名」,「電話」,「地址」和所有子元素),但就是這樣。這不是MSDN最後一次提供誤導或不正確的信息,但所提供的信息看起來正確且合乎邏輯。

+0

您是否嘗試過用「地址」或「netWorth」取代「手機」,看會發生什麼? – ChrisF 2010-12-06 23:34:18

+0

那麼代碼正在尋找聯繫人文件中的元素,這將是'聯繫'級別,而不是電話級別。你想要的是一個級別。 – 2010-12-06 23:34:56

回答

4

<phone><contact>的子元素,不是的根元素。如果你看看MSDN的例子,請注意他們在一個特定的聯繫人元素上調用元素。

你可以連元素調用*得到進一步的孩子:

foreach(XElement x in contacts.Elements("contact").Elements("phone")) 

*如果我們被挑剔,它不是真正的鏈接相同的功能,但IEnumerable<XObject>::Elements()行爲相當多,我們如何指望無論如何。

1

您正試圖訪問contacts的孩子的孩子。你必須做的事:

XElement contacts = XElement.Load(@"C:\Projects\ALL_MY_PROJECTS\LINQ_Noodling\UI\Contacts.xml"); 

foreach (x in contact.Elements("contact")) { 
    Console.WriteLine(x.Element("phone")); 
} 

contacts是XML的根,contact是一個孩子,phonecontact一個孩子。循環中的x是一個contact節點,您需要訪問其子節點。

2

我認爲在宣稱他人寫的東西是錯的之前,你應該多加註意。

中,他們做

foreach (x in contact.Elements("phone")) { 
    Console.WriteLine(x); 
} 

的部分是在之前

For example, you might have the following XML loaded into an XElement called contact: 

<contact> 
    Met in 2005. 
    <name>Patrick Hines</name> 
    <phone>206-555-0144</phone> 
    <phone>425-555-0145</phone> 
    <!--Avoid whenever possible--> 
</contact> 

而且你的XML文件不匹配。 Elements只發現直接子元素。因此,使用您提供的XML文件,訪問電話號碼(每個人的文件中),正確的方法是

XElement contacts = XElement.Load(@"C:\Projects\ALL_MY_PROJECTS\LINQ_Noodling\UI\Contacts.xml"); 
foreach (x in contacts.Elements("contact").Elements("phone")) { 
    Console.WriteLine(x); 
}