/ / 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 値?

EDIT

ジョン・スキートの答えに従って、私は試しました

私が行った場合

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

同じことが当てはまります

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

私はやらなければならなかった foreach(siteMap.Descendants()のvar loc) { if(loc.Name.LocalName!= "url") 持続する; //コード }

なぜそうなのか、誰か説明できますか?

回答:

回答№1は2

loc値を反復処理するにはどうすればよいですか?

最も簡単な方法は、のオーバーロードを使用することです Descendants それは XName

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

現在、「あなたは」を求めています loc 各要素内の要素-ただし、ルート要素も loc 要素が含まれています loc 子要素なので、 Element 返品 null、例外につながります。

現在、XMLは「t」ではないようです 実際に 質問にあることが示されました。代わりに、デフォルトの名前空間があります。

<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"))
{
...
}