Here is a PowerShell script to export SharePoint Term Groups to XML
param( [string]$siteUrl = "http://sharepoint.local:2013", [string]$termGroup = "Sample Term Group", [string]$exportPath = $null ) function Add-Snapin { if ((Get-PSSnapin -Name Microsoft.Sharepoint.Powershell -ErrorAction SilentlyContinue) -eq $null) { $global:SPSnapinAdded = $true Write-Host "Adding SharePoint module to PowerShell" -NoNewline Add-PSSnapin Microsoft.Sharepoint.Powershell -ErrorAction Stop Write-Host " - Done." } Write-Host "Adding Microsoft.SharePoint assembly" -NoNewline Add-Type -AssemblyName "Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" # Disable the above line and enable the line below for SharePoint 2013 # Add-Type -AssemblyName "Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Write-Host " - Done." } function Remove-Snapin { if ($global:SPSnapinAdded -eq $true) { Write-Host "Removing SharePoint module from PowerShell" -NoNewline Remove-PSSnapin Microsoft.Sharepoint.Powershell -ErrorAction SilentlyContinue Write-Host " - Done." } } function Get-ScriptDirectory { $Invocation = (Get-Variable MyInvocation -Scope 1).Value return Split-Path $Invocation.MyCommand.Path } function Export-SPTerms { param ( [string]$siteUrl = $(Read-Host -prompt "Please provide the site collection URL"), [string]$termGroupName = $(Read-Host -prompt "Please provide the term group name to export"), [string]$saveLocation = $(Read-Host -prompt "Please provide the path of the folder to save the CSV file to") ) if ([IO.Directory]::Exists($saveLocation) -eq $false) { New-Item ($saveLocation) -Type Directory | Out-Null } Write-Host "Getting Taxonomy Session"; $taxonomySession = Get-SPTaxonomySession -site $siteUrl $taxonomyTermStore = $taxonomySession.TermStores | Select Name $termStore = $taxonomySession.TermStores[$taxonomyTermStore.Name] $fileRootNoteCreated = $false; # Ampersands are stored as full width ampersands (see http://www.fileformat.info/info/unicode/char/ff06/index.htm) [Byte[]] $amp = 0xEF,0xBC,0x86 Write-Host "Looping through Term store Groups to find: '$termGroupName'" foreach ($group in $termStore.Groups) { Write-Host "Checking: '$($group.Name)'" $groupName = $group.Name.Replace([System.Text.Encoding]::UTF8.GetString($amp), "&"); if ($groupName -eq $termGroupName) { Write-Host "Looping through Term sets" foreach ($termSet in $group.TermSets) { # Remove unsafe file system characters from file name $parsedFilename = [regex]::replace($termSet.Name, "[^a-zA-Z0-9\-]", "_") $file = New-Object System.IO.StreamWriter($saveLocation + "termset_" + $parsedFilename + ".xml") # Write out the headers #$file.Writeline("Term Set Name,Term Set Description,LCID,Available for Tagging,Term Description,Level 1 Term, Level 2 Term,Level 3 Term,Level 4 Term,Level 5 Term,Level 6 Term,Level 7 Term") $file.Writeline("<termStore Name='" + $termStore.Name + "' GUID='" + $termStore.ID + "' Group='" + $groupName + "'>"); $file.Writeline("`t<termSet Name='" + $termSet.Name + "' GUID='" + $termSet.ID + "' Description='" + $termSet.Description + "'>"); try { Export-SPTermSet $termSet.Terms } finally { $file.Writeline("`t</termSet>"); $file.Writeline("</termStore>"); $file.Flush() $file.Close() } } } } } function Export-SPTermSet { param ( [Microsoft.SharePoint.Taxonomy.TermCollection]$terms, [int]$level = 1, [string]$previousTerms = "" ) $tabCount = $level+1; if ($level -gt 1) {$tabCount = $tabCount + ($level-1);} if ($terms.Count -gt 0) { $file.Writeline("`t" * $tabCount + "<terms>"); } if ($level -ge 1 -or $level -le 7) { if ($terms.Count -gt 0 ) { $termSetName = "" if ($level -eq 1) { $termSetName = """" + $terms[0].TermSet.Name.Replace([System.Text.Encoding]::UTF8.GetString($amp), "&") + """" } $terms | ForEach-Object { $termName = $_.Name.Replace([System.Text.Encoding]::UTF8.GetString($amp), "&"); $currentTerms = $previousTerms + ",""" + $termName + """"; $file.Writeline("`t" * $tabCount + "`t<term Name='" + $termName + "' isAvailableForTagging='" + $_.IsAvailableForTagging + "'>"); $file.Writeline("`t" * $tabCount + "`t`t<description>" + $_.GetDescription() + "</description>"); if ($level -lt 7) { Export-SPTermSet $_.Terms ($level + 1) ($previousTerms + $currentTerms) } $file.Writeline("`t" * $tabCount + "`t</term>"); } } } if ($terms.Count -gt 0) { $file.Writeline("`t" * $tabCount + "</terms>"); } } try { Write-Host "Starting export of Metadata Termsets" -ForegroundColor Green $ErrorActionPreference = "Stop" Add-Snapin if (!($exportPath)) { $exportPath = (Get-ScriptDirectory) } Write-Host "Site: $siteUrl" -ForegroundColor Yellow Write-Host "Term Group: $termGroup" -ForegroundColor Yellow Write-Host "Export Path: $exportPath" -ForegroundColor Yellow Export-SPTerms $siteUrl $termGroup $exportPath } catch { Write-Host "" Write-Host "Error : " $Error[0] -ForegroundColor Red throw } finally { Remove-Snapin } Write-Host Finished -ForegroundColor Blue