从XDocument中选择一个XElement

5

我真的不想求助,因为我知道最终会想出来,但是我已经花了太多时间了。如果文档有父标签或更好的结构,那就轻而易举了。可悲的是,我正在下载这个文档,但我就是想不出如何获取数据。

我尝试过几个 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);
                }
2个回答

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 );

啊,我完全不知道这是关于命名空间的问题,如果没有别人的帮助,我肯定解决不了它,谢谢! - Ash

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> 元素。请注意保留 HTML 标签。

谢谢提供示例,我已经更新了XML结构,因为它原来无法读取。不过奇怪的是,在循环内部的Add方法没有被触发(在它上面设置了断点)。你能否检查结构并确保我没有做什么愚蠢的事情。再次感谢。 - Ash
1
@Ash - 看看我的解决方案。如果没有命名空间,Steve的解决方案是正确的,但你的示例需要一个命名空间管理器。 - Metro Smurf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接