2010-08-11 45 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