param( [Parameter(Mandatory=$true,Position=0)] [string]$BaseUrl, [ValidateRange(1,1000)] [int]$MaxDepth = 5, [string]$OutputPath = "sitemap.xml" ) function Resolve-Url { param( [string]$Base, [string]$Reference ) try { $uriBase = [System.Uri]::new($Base) $resolved = [System.Uri]::new($uriBase, $Reference) return $resolved.AbsoluteUri } catch { return $null } } function Get-InternalLinks { param( [string]$PageUrl, [string]$RootHost ) try { $response = Invoke-WebRequest -Uri $PageUrl -UseBasicParsing -ErrorAction Stop } catch { return @() } $links = @() foreach ($a in $response.ParsedHtml.getElementsByTagName('a')) { $href = $a.href if ([string]::IsNullOrWhiteSpace($href)) { continue } $abs = Resolve-Url -Base $PageUrl -Reference $href if ($null -eq $abs) { continue } $uri = [System.Uri]::new($abs) if ($uri.Host -eq $RootHost -and $uri.Scheme -match 'https?') { $clean = $uri.GetLeftPart('PathAndQuery').TrimEnd('#') $links += $clean } } return $links | Sort-Object -Unique } $rootUri = [System.Uri]::new($BaseUrl) $rootHost = $rootUri.Host $queue = New-Object System.Collections.Generic.Queue[PSObject] $visited = [System.Collections.Generic.HashSet[string]]::new() $queue.Enqueue([pscustomobject]@{ Url = $BaseUrl; Depth = 0 }) $visited.Add($BaseUrl) | Out-Null $collected = @() while ($queue.Count -gt 0) { $item = $queue.Dequeue() $url = $item.Url $depth = $item.Depth $collected += $url if ($depth -ge $MaxDepth) { continue } $links = Get-InternalLinks -PageUrl $url -RootHost $rootHost foreach ($link in $links) { if (-not $visited.Contains($link)) { $visited.Add($link) | Out-Null $queue.Enqueue([pscustomobject]@{ Url = $link; Depth = $depth + 1 }) } } } # Build XML [xml]$xmlDoc = New-Object System.Xml.XmlDocument $xmlDeclaration = $xmlDoc.CreateXmlDeclaration("1.0","UTF-8",$null) $xmlDoc.AppendChild($xmlDeclaration) | Out-Null $ns = "http://www.sitemaps.org/schemas/sitemap/0.9" $urlset = $xmlDoc.CreateElement("urlset", $ns) $xmlDoc.AppendChild($urlset) | Out-Null foreach ($loc in $collected | Sort-Object -Unique) { $urlElem = $xmlDoc.CreateElement("url", $ns) $locElem = $xmlDoc.CreateElement("loc", $ns) $locElem.InnerText = $loc $urlElem.AppendChild($locElem) | Out-Null $lastmodElem = $xmlDoc.CreateElement("lastmod", $ns) $lastmodElem.InnerText = (Get-Date).ToString("yyyy-MM-ddTHH:mm:sszzz") $urlElem.AppendChild($lastmodElem) | Out-Null $urlset.AppendChild($urlElem) | Out-Null } $xmlDoc.Save($OutputPath) Write-Output "Sitemap generated: $OutputPath" Write-Output "Total URLs: $($collected.Count)"