Looking for a solution to import Term Store Terms using CSOM & PowerShell in O365 / SharePoint Online?

Here you go….

Note: Modify the XML term attributes and PS script logic as per your requirement

XML Config File Structure

config-xml1

PowerShell Script

try {
    Write-Host "Load XML config file" -foregroundcolor black -backgroundcolor yellow Set-Location
    $xdoc = [xml] (get-content "C:\Joseph\Code\SPRIDER\PS\TermStore\config.xml")
    $Url = $xdoc.Tenant.Admin.site $Admin = $xdoc.Tenant.Admin.username $Pwd = $xdoc.Tenant.Admin.password
    $SecurePwd = $Pwd    ConvertTo-SecureString -AsPlainText -force
    Write-Host "Global variables loaded succeefully" -foregroundcolor black -backgroundcolor Green
}
catch {
    Write-Host "Error : $_.Exception.Message" -foregroundcolor black -backgroundcolor Red return
}
try {
    Write-Host "Load CSOM DLLs" -foregroundcolor black -backgroundcolor yellow Set-Location
    Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll" Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll" Add-Type -Path "c:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Taxonomy.dll"
    Write-Host "CSOM DLLs loaded succeefully" -foregroundcolor black -backgroundcolor Green
}
catch {
    Write-Host "Error : $_.Exception.Message" -foregroundcolor black -backgroundcolor Red return
}
function Recursive($inputerm,$inputNode) {
    Foreach ($InnerTermNode in $inputNode.term) {
        $childterms = $inputerm.Terms $Ctx.Load($childterms) $Ctx.ExecuteQuery() $childterm = $childterms    Where-Object {
            $_.Name -eq $InnerTermNode.name
        }
        if($childterm) {
            Write-Host "Term" $InnerTermNode.name "already exists." -foregroundcolor black -backgroundcolor yellow
        }
        else {
            Write-Host "Creating term " $InnerTermNode.name -foregroundcolor black -backgroundcolor yellow
            $childterm = $inputerm.CreateTerm($InnerTermNode.name, 1033, [System.Guid]::NewGuid()) try {
                $Ctx.ExecuteQuery()
                Write-Host "Term" $childterm.name "Created successfully" -foregroundcolor black -backgroundcolor Green
            }
            catch {
                Write-Host "Error while creating Term" $InnerTermNode.name $_.Exception.Message -foregroundcolor black -backgroundcolor Red return
            }
        }
        if($InnerTermNode.ChildNodes.Count -gt 0) {
            Recursive $childterm $InnerTermNode
        }
    }
}
try {
    Write-Host "Authenticate tenant site $url and get ClientContext object" -foregroundcolor black -backgroundcolor yellow
    $Ctx = New-Object Microsoft.SharePoint.Client.ClientContext($Url) $Credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($Admin, $SecurePwd) $Ctx.Credentials = $Credentials if (!$Ctx.ServerObjectIsNull.Value) {
        Write-Host "Connected to SharePoint Online site: " $Ctx.Url "" -foregroundcolor black -backgroundcolor Green
        $TaxonomySession = [Microsoft.SharePoint.Client.Taxonomy.TaxonomySession]::GetTaxonomySession($Ctx) $TaxonomySession.UpdateCache() $Ctx.Load($TaxonomySession) $Ctx.ExecuteQuery()
        Write-Host "Taxonomy session initiated: " $TaxonomySession.Path.Identity "" -foregroundcolor black -backgroundcolor Green
        $termStore = $TaxonomySession.GetDefaultSiteCollectionTermStore() $Ctx.Load($termStore) $Ctx.ExecuteQuery() Foreach ($GroupName in $xdoc.Tenant.TermStore.group) {
            Write-Host "Getting list of groups from term store" -foregroundcolor black -backgroundcolor yellow
            $groups = $termStore.Groups $Ctx.Load($groups) $Ctx.ExecuteQuery()
            try {
                $Ctx.ExecuteQuery()
                Write-Host "List of groups from term store loaded successfully" -foregroundcolor black -backgroundcolor Green
            }
            catch {
                Write-Host "Error while getting list of groups from term store" $_.Exception.Message -foregroundcolor black -backgroundcolor Red return
            }
            Write-Host "Check whether the group is exist in the term store" -foregroundcolor black -backgroundcolor yellow
            $group = $groups    Where-Object {
                $_.Name -eq $GroupName.name
            }
            if ($group) {
                Write-Host "Group" $GroupName.name "already exists." -foregroundcolor black -backgroundcolor yellow
                $group = $termStore.Groups.GetByName($GroupName.name) $Ctx.Load($group) $Ctx.ExecuteQuery()
            }
            else {
                Write-Host "Creating group" $GroupName.name -foregroundcolor black -backgroundcolor yellow
                $group = $termStore.CreateGroup($GroupName.name,[System.Guid]::NewGuid().toString())
                try {
                    $Ctx.ExecuteQuery()
                    Write-Host "Group" $GroupName.name "Created successfully" -foregroundcolor black -backgroundcolor Green
                }
                catch {
                    Write-Host "Error while creating Group" $GroupName.name $_.Exception.Message -foregroundcolor black -backgroundcolor Red return
                }
            }
            Foreach ($TermSetNode in $GroupName.termset) {
                $termSets = $group.TermSets $Ctx.Load($termSets) $Ctx.ExecuteQuery()
                $termSet = $termSets    Where-Object {
                    $_.Name -eq $TermSetNode.name
                }
                if($termSet) {
                    Write-Host "Termset" $TermSetNode.name "already exists." -foregroundcolor black -backgroundcolor yellow
                    $termSet = $group.TermSets.GetByName($TermSetNode.name) $Ctx.Load($termSet) $Ctx.ExecuteQuery()
                }
                else {
                    Write-Host "Creating term set" $TermSetNode.name -foregroundcolor black -backgroundcolor yellow
                    $termSet = $group.CreateTermSet($TermSetNode.name,[System.Guid]::NewGuid().toString(),1033)
                    try {
                        $Ctx.ExecuteQuery()
                        Write-Host "Term set " $TermSetNode.name "Created successfully" -foregroundcolor black -backgroundcolor Green
                    }
                    catch {
                        Write-Host "Error while creating Term set" $TermSetNode.name $_.Exception.Message -foregroundcolor black -backgroundcolor Red return
                    }
                }
                Foreach ($TermNode in $TermSetNode.term) {
                    $terms = $termSet.Terms $Ctx.Load($terms) $Ctx.ExecuteQuery() $term = $terms    Where-Object {
                        $_.Name -eq $TermNode.name
                    }
                    if($term) {
                        Write-Host "Term" $TermNode.name "already exists." -foregroundcolor black -backgroundcolor yellow
                    }
                    else {
                        Write-Host "Creating term " $TermNode.name -foregroundcolor black -backgroundcolor yellow
                        $term = $termSet.CreateTerm($TermNode.name, 1033, [System.Guid]::NewGuid())
                        try {
                            $Ctx.ExecuteQuery()
                            Write-Host "Term" $TermNode.name "Created successfully" -foregroundcolor black -backgroundcolor Green
                        }
                        catch {
                            Write-Host "Error while creating Term" $TermNode.name $_.Exception.Message -foregroundcolor black -backgroundcolor Red return
                        }
                    }
                    if($TermNode.ChildNodes.Count -gt 0) {
                        Recursive $term $TermNode
                    }
                }
            }
        }
    }
}
catch {
    Write-Host "Error : $_.Exception.Message" -foregroundcolor black -backgroundcolor Red return
}