2015-06-03 3 views
0

Я пытаюсь понять XDocument и это различные методы.XML XDocument - Кажется, что нет элементов

У меня есть карта сайта, и я пытаюсь прочитать URL-

<urlset xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"> 
    <url> 
     <loc>http://www.site.co.uk/</loc> 
    </url> 
    <url> 
     <loc>http://www.site.co.uk/page</loc> 
    </url> 
</urlset> 

выше разбирает хорошо, и я пытаюсь прочитать значения LOC (страницы, URL), но это, где это пойдет не так

 string siteMapText = String.Empty(); 
     GetValueOfPageFromWebClient(SiteMapUrl, out siteMapText); 

     XDocument siteMap = 
      XDocument.Parse(siteMapText); 

     foreach (var loc in siteMap.Descendants()) 
     { 
      //logic 
     } 

В моей C#

loc.Element("loc").Value //should show value but doesn't 

Как перебрать loc значений ?

EDIT

Согласно ответу Джона Скита, я попытался

Если я

foreach (var loc in siteMap.Descendants("loc")) 
    { 
     //never enters 
    } 

То же самое относится и к

foreach (var loc in siteMap.Descendants("url")) 
    { 
     //never enters 
    } 

Я должен был do foreach (var loc in s iteMap.Descendants()) { if (loc.Name.LocalName! = "url") continue; // код }

Может кто-нибудь объяснить, почему это так?

ответ

2

Как выполнить итерацию по значениям loc?

Самый простой способ заключается в использовании перегрузки Descendants который принимает XName:

foreach (var loc in siteMap.Descendants("loc")) 
{ 
    string value = loc.Value; 
    ... 
} 

В настоящее время, вы просите для loc элемента в пределах каждого элемента - но ни один корневой элемент, ни loc элементы содержат loc дочерние элементы, поэтому Element возвращает null, что приводит к исключению.

Теперь кажется, что XML не фактически, как вы показали, что он находится в вопросе. Вместо этого, он имеет пространство имен по умолчанию:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" ...> 

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

XNamespace ns = "http://www.sitemaps.org/schemas/sitemap/0.9"; 
foreach (var loc in siteMap.Descendants(ns + "loc")) 
{ 
    ... 
} 
+0

На самом деле, извините, это не сработает! Когда я перегружаю «Потомки» («loc») ', foreach перепрыгивает прямо (указывая, что у него нет детей). Даже если я обновляюсь до 'siteMap.Descendants (« url »)' тот же самый вопрос сохраняется – MyDaftQuestions

+0

Странно, это работает для меня. Однако я получаю сообщение об ошибке при анализе XML, который вы указали в вопросе. Для вашей проблемы это может быть проблема с пространством имен, посмотрите на XML, который находится в siteMapText. – Philippe

+0

@MyDaftQuestions: Это говорит о том, что XML не так, как вы показали, это - например. у вас есть пространство имен, которое вы не показывали. Это объясняет все, и его легко исправить, используя пространство имен. Если вы можете заставить XML в вопросе отражать * фактический * XML, который вы используете, я уверен, что мы сможем легко его исправить. –

Смежные вопросы