Get-DataFromAsvXml.ps1

function createXmlObj
{
  param
  (
    $XMLPath
  )
  $asv = New-Object -TypeName System.Xml.XmlDocument
  $asv.Load($XMLPath)
  return $asv
}

function transformAsvData
{
  param
  (
    $asvData
  )
  $base = $asvData.asv_export.schulen.schule
  $unterrichts = @()
  $klassen = @()
  $faecher = @{}
  $teacher = @()
  
  foreach($i in $base.unterrichtselemente.unterrichtselement)
  {
    if($i.klassengruppe_id -eq $null){continue}
    $objin = New-Object -TypeName PSObject
    $objin | Add-Member -MemberType NoteProperty -Name SynKey -Value ($i.lehrkraft_id + "." + $i.klassengruppe_id + "." + $i.fach_id )
    $objin | Add-Member -MemberType NoteProperty -Name Id -Value $i.xml_id
    $objin | Add-Member -MemberType NoteProperty -Name LehrkraftId -Value $i.lehrkraft_id
    $objin | Add-Member -MemberType NoteProperty -Name KlassenGruppeId -Value $i.klassengruppe_id
    $objin | Add-Member -MemberType NoteProperty -Name FachId -Value $i.fach_id
    $unterrichts += $objin
  }

  foreach($s in $base.klassen.klasse)
  {
    $objin = New-Object -TypeName PSObject
    $objin | Add-Member -MemberType NoteProperty -Name Id -Value $s.xml_id
    $objin | Add-Member -MemberType NoteProperty -Name Klassenname -Value $s.klassenname_lang."#cdata-section"
    
    $klassengruppen = @()
    foreach ($k in $s.klassengruppen.klassengruppe)
    {
      $klassendata = New-Object -TypeName psobject
      $klassendata | Add-Member -MemberType NoteProperty -Name KlassenGruppenId -Value $k.xml_id
      
      $schueler = @()
      foreach ($ss in $k.schuelerliste.schuelerin)
      {
        $schuelerdata = New-Object -TypeName PSObject
        
        $schuelerdata | Add-Member -MemberType NoteProperty -Name SchuelerId -Value $ss.xml_id
        
        $vorname = ($ss.rufname."#cdata-section")
        $schuelerdata | Add-Member -MemberType NoteProperty -Name Vorname -Value $vorname
        
        $familienname = $ss.familienname."#cdata-section".Replace(" ","-")
        $schuelerdata | Add-Member -MemberType NoteProperty -Name Familienname -Value $familienname
        
        $schuelerdata | Add-Member -MemberType NoteProperty -Name GebDatum -Value $ss.geburtsdatum."#cdata-section"
        
        $anschriftstext = $ss.schueleranschriften.schueleranschrift[0].anschrift.anschrifttext.'#cdata-section'
        $schuelerdata | Add-Member -MemberType NoteProperty -Name Anschriftstext -Value $anschriftstext
        
        $strasse = $ss.schueleranschriften.schueleranschrift[0].anschrift.strasse.'#cdata-section'
        $schuelerdata | Add-Member -MemberType NoteProperty -Name Strasse -Value $strasse
        
        $ort = $ss.schueleranschriften.schueleranschrift[0].anschrift.ortsbezeichnung.'#cdata-section'
        $schuelerdata | Add-Member -MemberType NoteProperty -Name Ort -Value $ort
        
        $plz = $ss.schueleranschriften.schueleranschrift[0].anschrift.postleitzahl.'#cdata-section'
        $schuelerdata | Add-Member -MemberType NoteProperty -Name PLZ -Value $plz
        
        $hsnr = $ss.schueleranschriften.schueleranschrift[0].anschrift.nummer.'#cdata-section'
        $schuelerdata | Add-Member -MemberType NoteProperty -Name HausNummer -Value $hsnr
        
        $schueler += $schuelerdata
      }
      
      $klassendata | Add-Member -MemberType NoteProperty -Name Klassenliste -Value $schueler
      
      $klassengruppen += $klassendata
    }
        
    $objin | Add-Member -MemberType NoteProperty -Name KlassenGruppen -Value $klassengruppen
    $klassen += $objin
  }
  
  foreach ($f in $base.faecher.fach)
  {
    $faecher.Add([int]$f.xml_id, $f.anzeigeform."#cdata-section")
  }
  
  $lehrerMap = @{}
  foreach ($l in $base.lehrkraefte.lehrkraft)
  {
    $lehrerMap.Add([int]$l.lehrkraftdaten_nicht_schulbezogen_id, $l.xml_id)
  }
  
  foreach($t in $asvData.asv_export.lehrkraftdaten_nicht_schulbezogen_liste.lehrkraftdaten_nicht_schulbezogen)
  {
    $objin = New-Object -TypeName PSObject
    $objin | Add-Member -MemberType NoteProperty -Name TeacherId -Value $lehrerMap.Get_item([int]$t.xml_id)
    
    $vorname = ($t.vornamen."#cdata-section".split(" "))[0]
    $objin | Add-Member -MemberType NoteProperty -Name Vorname -Value $vorname
    
    $familienname = $t.familienname."#cdata-section".replace(" ","-")
    $objin | Add-Member -MemberType NoteProperty -Name Familienname -Value $familienname
    $teacher += $objin
  }
  
  $out = New-Object -TypeName PSObject
  $out | Add-Member -MemberType NoteProperty -Name Unterrichtselemente -Value ($unterrichts | Sort-Object -Unique -Property SynKey)
  $out | Add-Member -MemberType NoteProperty -Name Klassen -Value $klassen
  $out | Add-Member -MemberType NoteProperty -Name Faecher -Value $faecher
  $out | Add-Member -MemberType NoteProperty -Name Lehrer -Value $teacher
  return $out
    
}

function Get-DataFromAsvXml
{
<#
 .Synopsis
  Reads ASV Data and returns a custom object.
 
 .Description
  Returns ASV Data as custom object readable by this module
 
 .Parameter XMLPath
  Path to export.csv (C:\export\export.xml)
 
 .Example
  # Get data from asv and store in $data.
  $data Get-DataFromAsvXml -XMLPath C:\users\myuser\Documents\ASV-Export\export.xml
#>

  param
  (
    [string]
    $XMPath
  )
  $asv = createXmlObj -XMLPath $XMPath
  return transformAsvData -asvData $asv
}