# encoding: ascii
# api: powershell
# title: Write-Sitemap.ps1
# description: If you have a medium to large size website, you can provide a Sitemap so that search engines intelligently index your site’s content.
# version: 1.0
# type: script
# author: uknzguy
# license: CC0
# x-poshcode-id: 833
# x-archived: 2016-04-19T06:39:28
# x-published: 2009-01-28T13:10:00
#
# A Sitemap in it’s simplest form is an XML file containing a list of available URLs on your site. See sitemaps.org for more information on Sitemaps in general.
# This script is intended as a starting point for generating a Sitemap for your site – since every website is different you will most likely need to customise it to make it work for you.
# In it’s present form, this script generates a list of static URLs based on the contents of an array and also a list of product / location / items from a text file. This can be expanded as necessary to suit your requirements.
#
####################################################################################################
## Write-Sitemap.ps1
##
## Generates a basic Sitemap for your website, based on a list of locations / products or whatever,
## (depending on your requirements). Can easily be extended to create more complex Sitemaps.
## 
## This uses XMLTextWriter and is based on the RSS creator script at 
## http`://pshscripts.blogspot.com/2008/12/write-rssstreamps1.html
##
## Note the URLs in this script have been escaped. You may have to remove the backticks.
####################################################################################################
## Sitemap format, as output by this script (see http`://www.sitemaps.org/protocol.php for more)
##
## <?xml version="1.0" encoding="utf-8"?>
## <urlset xmlns="http`://www.google.com/schemas/sitemap/0.9">
##  <url>
##   <loc>http`://your.url/here/product1</loc>
##  </url>
##  <url>
##   <loc>http`://your.url/here/product2</loc>
##  </url>
## </urlset>
####################################################################################################

# Let's Set up some variables
$workingdir = "c:\scripts"
$Domain 	= "http`://www.somesite.url"		# Base URL - CHANGE THIS!
$path 		= "$workingdir\sitemap.xml"		# Where the output file will go


$Statics 	= @("help", "contact", "terms", "privacy") 	# Any static links go here
$Locations 	= Get-Content "$workingdir\products.txt"    # A list of product IDs

$Counter 	= 0		# Keep track of how many URLs we include. Must be less than 50k per file.

# This function does the bulk of the work, creating a new <url> and <loc> element for each URL
function CreateElement([string]$url)
{
	$w = $global:writer
	$w.WriteStartElement("url")
	$w.WriteStartElement("loc")
	$w.WriteString($url)
	$w.WriteEndElement() #end loc
	$w.WriteEndElement() #end url

	$global:counter++	# Increment URL counter
}

#### MAIN #####

# Set up encoding, and create new instance of XMLTextWriter
$encoding = [System.Text.Encoding]::UTF8
$writer = New-Object System.Xml.XmlTextWriter( $Path, $encoding )
$writer.Formatting = [system.xml.formatting]::indented

Write-Host "`r`n`r`nGenerating $Domain Sitemap... $path"

# Write start of XML document
$writer.WriteStartDocument()

# Write Start of sitemap doc
$writer.WriteStartElement( "urlset" )
$writer.WriteAttributeString( "xmlns", "http`://www.sitemaps.org/schemas/sitemap/0.9" )

# Write our static URLs
foreach ($static in $statics)
{
	CreateElement "$Domain/$Static"
}

# Write all location URLs
foreach ($Location in $Locations)
{
	$r = "$domain/product/$location"
	CreateElement $r
}

# You could add more URL definitions here as needed...

# Write end of document information
$writer.WriteEndElement() # End urlset

# Make sure we close the file
$writer.close()

# Let's see what it has done
# cat $path

# See how many elements were output
Write-Host "`n`rTotal number of URLs : $Counter"
# If this is more than 50,000 we should split into multiple sitemap files...
