using System.Xml.Linq; namespace WordPressStaticExporter.Services; public sealed class SiteMapService { private readonly HttpClient _http = new(); public async Task> DiscoverAsync(Uri siteUrl, CancellationToken cancellationToken) { var results = new HashSet(); var candidates = new[] { new Uri(siteUrl, "/sitemap.xml"), new Uri(siteUrl, "/sitemap_index.xml"), new Uri(siteUrl, "/wp-sitemap.xml") }; foreach (var sitemap in candidates) { try { var xml = await _http.GetStringAsync(sitemap, cancellationToken); var doc = XDocument.Parse(xml); foreach (var value in doc.Descendants().Where(x => x.Name.LocalName == "loc").Select(x => x.Value.Trim())) { if (Uri.TryCreate(value, UriKind.Absolute, out var uri) && string.Equals(uri.Host, siteUrl.Host, StringComparison.OrdinalIgnoreCase)) results.Add(uri); } } catch { } } return results; } }