/ / XML XDocument - Здається, елементів немає - c #, xml

XML XDocument - Там, як видається, немає елементів - c #, 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 цінності

РЕДАГУВАТИ

Відповідно до відповіді Джона Скіта, я спробував

Якщо я це зробив

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

Те ж саме і з

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

I"ve had to do foreach (var loc in siteMap.Descendants()) { if (loc.Name.LocalName != "url") continue; //code }

Can some one explain why this is the case?

Відповіді:

2 для відповіді № 1

How do I iterate over the loc values?

The simplest way is to use the overload of Descendants яка приймає XName:

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

Currently, you"re asking for the loc element within each element - but neither the root element nor the loc elements contain loc child elements, so Element повертає null, leading to an exception.

Now it seems that the XML isn"t насправді as you"ve shown it to be in the question. Instead, it has a default namespace:

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

So all the descendant elements are in that namespace too, because they don"t specify anything else... so you need to specify the namespace when you"re looking for things. Fortunately, that"s easy:

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