【问题标题】:Selecting a XElement from a XDocument从 XDocument 中选择 XElement
【发布时间】:2010-08-11 17:12:25
【问题描述】:

我真的不想寻求帮助,因为我知道我最终会弄明白的,但是我花了太多时间,如果文档有父标签或更好的结构,那将是一个蛋糕。遗憾的是,我正在下载文档,但我不知道如何获取数据。

我已经尝试了一些 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>

这是一个最新的 sn-p 示例。

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

【问题讨论】:

    标签: c# xml linq linq-to-xml


    【解决方案1】:

    您需要添加一个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 );
    

    【讨论】:

    • 啊,我对命名空间一无所知,如果没有人的帮助,肯定不会解决它,谢谢!
    【解决方案2】:

    我假设您想要文档中的 all &lt;Url&gt; 元素。如果是这种情况,那么您的循环几乎就在那里。您需要执行以下操作。

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

    Root 获取对根元素的引用,以下Descendants 语句仅返回&lt;Result&gt; 节点。最后一个Descendants 语句进一步限制&lt;Result&gt; 节点枚举器只返回&lt;Url&gt; 元素。

    【讨论】:

    • 感谢您的示例,我已经更新了 xml 结构,因为它不可读。无论如何,奇怪的是循环中的 Add 方法没有被触发(有一个断点)你能检查一下结构并确保我没有做一些愚蠢的事情吗?再次感谢
    • @Ash - 查看我的解决方案。如果没有命名空间,Steve 是正确的,但您的示例需要命名空间管理器。
    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多