param( [Parameter(Mandatory=$true,HelpMessage="URL of the sitemap.xml to process")] [string]$SitemapUrl, [Parameter(Mandatory=$false,HelpMessage="Path to output file (defaults to sitemap_urls.txt in current directory)")] [string]$OutputPath = "$(Get-Location)\sitemap_urls.txt" ) function Get-UrlsFromSitemap { param( [xml]$XmlDoc, [string]$BaseUrl ) $urls = @() # Detect if this is a sitemap index if ($XmlDoc.sitemapindex) { foreach ($sitemapNode in $XmlDoc.sitemapindex.sitemap) { $loc = $sitemapNode.loc -as [string] if ($loc) { try { $subContent = Invoke-WebRequest -Uri $loc -UseBasicParsing -ErrorAction Stop $subXml = [xml]$subContent.Content $urls += Get-UrlsFromSitemap -XmlDoc $subXml -BaseUrl $loc } catch { Write-Warning "Failed to retrieve nested sitemap at $loc : $_" } } } } elseif ($XmlDoc.urlset) { foreach ($urlNode in $XmlDoc.urlset.url) { $loc = $urlNode.loc -as [string] if ($loc) { $urls += $loc } } } else { Write-Warning "Unrecognized sitemap structure at $BaseUrl" } return $urls } try { Write-Host "Downloading sitemap from $SitemapUrl ..." $response = Invoke-WebRequest -Uri $SitemapUrl -UseBasicParsing -ErrorAction Stop $xmlDoc = [xml]$response.Content } catch { Write-Error "Failed to download sitemap from $SitemapUrl : $_" exit 1 } Write-Host "Parsing sitemap..." $allUrls = Get-UrlsFromSitemap -XmlDoc $xmlDoc -BaseUrl $SitemapUrl if ($allUrls.Count -eq 0) { Write-Warning "No URLs found in the provided sitemap." } else { Write-Host "Found $($allUrls.Count) URLs. Writing to $OutputPath ..." try { $allUrls | Sort-Object -Unique | Out-File -FilePath $OutputPath -Encoding UTF8 Write-Host "Successfully wrote URLs to $OutputPath" } catch { Write-Error "Failed to write output file: $_" exit 1 } }