Выбор XElement из XDocument - PullRequest
       4

Выбор XElement из XDocument

5 голосов
/ 11 августа 2010

Я действительно не хотел просить о помощи, так как знаю, что в конце концов пойму, но я потратил слишком много времени, если бы у документа были родительские теги или лучшая структура, это был бы кусоккекс.К сожалению, я загружаю документ, и я просто не могу понять, как получить данные.

Я пробовал несколько запросов linq и foreach, используя XElement в качестве итератора.В любом случае, вот пример структуры.

<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 голосов
/ 11 августа 2010

Вам нужно будет добавить 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 голосов
/ 11 августа 2010

Я предполагаю, что вы хотите все <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>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...