2010-08-11 84 views
5

我真的不想要求幫助,因爲我知道我最終會想出來,但是我花了太多時間,如果文檔有父標籤或更好的結構,這將是一塊蛋糕。可悲的是我正在下載文件,而我無法弄清楚如何獲取數據。從XDocument中選擇一個XElement

我已經嘗試了幾個linq查詢和一個使用XElement作爲迭代器的foreach。無論如何,這裏是結構的一個例子。

<ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:srch" xsi:schemaLocation="urn:yahoo:srch http://api.search.yahoo.com/SiteExplorerService/V1/InlinkDataResponse.xsd" totalResultsAvailable="247930100" firstResultPosition="99" totalResultsReturned="100"> 
<Result> 
    <Title>Adobe - Adobe Reader</Title> 
    <Url>http://get.adobe.com/fr/reader/</Url> 
    <ClickUrl>http://get.adobe.com/fr/reader/</ClickUrl> 
    </Result> 
<Result> 
    <Title>Religious Tolerance</Title> 
    <Url>http://www.religioustolerance.org/</Url> 
    <ClickUrl>http://www.religioustolerance.org/</ClickUrl> 
    </Result> 
<Result> 
    <Title>Applications Internet riches (RIA) | Adobe Flash Player</Title> 
    <Url>http://www.adobe.com/fr/products/flashplayer/</Url> 
    <ClickUrl>http://www.adobe.com/fr/products/flashplayer/</ClickUrl> 
    </Result> 
<Result> 
    <Title>photo management software | Adobe Photoshop Lightroom 3</Title> 
    <Url>http://www.adobe.com/products/photoshoplightroom/</Url> 
    <ClickUrl>http://www.adobe.com/products/photoshoplightroom/</ClickUrl> 
    </Result> 
<Result> 
    <Title>Battle for Wesnoth</Title> 
    <Url>http://www.wesnoth.org/</Url> 
    <ClickUrl>http://www.wesnoth.org/</ClickUrl> 
    </Result> 
</ResultSet> 

下面是一個最新代碼片段的例子。

foreach (XElement ele in xDoc.Descendants("ResultSet").Elements("Result")) 
       { 
        CollectedUris.Add(ele.Element("Url").Value); 
       } 

回答

8

你需要添加一個XNamespace

XNamespace ns = "urn:yahoo:srch"; 

var query = xDoc.Root.Descendants(ns + "Result").Elements(ns + "Url") 

foreach(XElement e in query) 
{ 
    CollectedUris.Add(e.Value); 
} 

編輯
獎勵積分LINQ的解決方案:

xDoc.Root.Descendants(ns + "Result") 
    .Elements(ns + "Url") 
    .Select(x => x.Value).ToList() 
    .ForEach(CollectedUris.Add); 
+0

啊我對命名空間一無所知,如果沒有人幫助,肯定不會解決它,謝謝! – Ash 2010-08-11 19:09:35

2

我假設你想文檔中的所有<Url>元素。如果是這樣的話,那麼你的循環幾乎就在那裏。您將需要執行以下操作。

using System.Xml.Linq; 

foreach (XElement ele in xDoc.Root.Descendants("Result").Descendants("Url") 
{ 
    CollectedUris.Add(ele.Value); 
} 

Root讓你的根元素的引用,以下Descendants語句只返回<Result>節點。最後的Descendants聲明進一步限制了<Result>節點枚舉器僅返回<Url>元素。

+0

感謝您的例子,我已經更新了XML結構,因爲它不可讀。無論如何,奇怪的是循環內的Add方法沒有被觸發(在它上面有一箇中斷點)你能否檢查出結構並確保我沒有做出愚蠢的事情。再次感謝 – Ash 2010-08-11 17:47:58

+1

@Ash - 請參閱我的解決方案。如果沒有命名空間,Steve的說法是正確的,但是您的示例需要命名空間管理器。 – 2010-08-11 17:51:13