Simple Sitemap Generator

How to automatically generate a site map using a T4 text template

When I first created this web site I knew that I needed to create a sitemap.xml file and submit it to Google. This would permit Google to determine which pages I wanted indexed and which page was the canonical version. I did not really want to create one by hand and then have to keep it up to date every time I made changes to the site. I have a very basic site, so it seemed like it would not be a difficult task to automate building the site map. Most of the solutions I found online were overkill for such a simple web site, so I decided to create my own. This article describes my solution so that others might be able to adapt it for use on their own web site. If you have a more complex web site this solution might be too simplified.

Visual Studio is able to create and run T4 text templates, which are a mixture of text and control logic for generating text files. After looking at the capabilities of T4 files I found them to be a perfect solution for generating my site map. The Microsoft documentation for code generation and T4 text templates is located at To add a T4 text template to a Visual Studio project use the add new item menu and search for text template. That should enable you to add a text template to your project.

The logic I used to generate my site map is pretty simple. Since all of my aspx pages are located in the same folder, I just get a listing of all the aspx pages in that folder. If your web site has sub-folders you will need to include those folders either by processing them explicitly or recursively. There were a few pages I didn't want indexed, so I created an array of pages to exclude from the site map. Then I loop through all the aspx pages. If the page isn't in the exclusion list I generate an entry in the site map.

Here is the code for the T4 file.

<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".xml" #>
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="">  
string[] pagesToExclude = {
DirectoryInfo directoryInfo = new DirectoryInfo(this.Host.ResolvePath(""));
FileInfo[] Files = directoryInfo.GetFiles("*.aspx");
foreach(FileInfo file in Files) { 
if (!pagesToExclude.Contains(file.Name)) { #>
<# string fileName = Path.GetFileNameWithoutExtension(file.Name);
if (fileName.Equals("Default")) { fileName = "";} #>
    <loc><#= fileName #></loc>
    <lastmod><#= File.GetLastWriteTime(Path.Combine(file.DirectoryName, file.Name)).ToUniversalTime().ToString("yyyy-MM-dd") #></lastmod>
<# }
 } #>

If you want to have Visual Studio run the text transformation automatically as part of every build see this article

I hope you find this useful. It works for me.
Written by KB3HHA on 07/17/2020