# -------------------------------------------------------------------------------
# Modify-Infos-in-XML_METS.ps1

# ndert das MAX- auf das DEFAULT-Default-Attribut zur korrekten Nutzung von METS-Dateien durch den DFG-Viewer
#
# --- METS Vorher ---
#  <mets:fileSec xmlns:mods="http://www.loc.gov/mods/v3">
#    <mets:fileGrp ID="mets-fgrp-00001" USE="DEFAULT">
#    </mets:fileGrp>
#    <mets:fileGrp USE="MAX">
#      <mets:file ID="FID_0000000001_MAX" MIMETYPE="image/jpeg" SIZE="1520633">

# --- METS Nachher ---
#  <mets:fileSec xmlns:mods="http://www.loc.gov/mods/v3">
#    <mets:fileGrp USE="DEFAULT" ID="mets-fgrp-00001">
#      <mets:file ID="FID_0000000001_MAX" MIMETYPE="image/jpeg" SIZE="1520633">
# 
# Aufruf:  %Systemroot%\system32\windowspowershell\v1.0\powershell.exe  
#            -command .\Modify-Infos-in-XML_METS.ps1 [relativer Pfad zum Ordnerstruktur mit mets.xml-Dateien]
#
#           Beispiel:
# powershell .\Modify-Infos-in-XML_METS.ps1 Stadtarchiv_Metelen
# -------------------------------------------------------------------------------


# ---------------- Fixe Paramter ----------------

# Pfad zum Quellverzeichnis mit den mets.xml-Dateien
# ------- MUSS HIER GGF. ANGEPASST WERDEN! --------
$snipRoot = "[Laufwerk]:\[Ordnername]"


# ---------------- Variable Paramter ----------------
 
# Kommandozeilenargument, bergeben wird relativer Pfad zum Quellverzeichnis mit den mets.xml-Dateien
# z.B. "Stadtarchiv_Metelen"
$relPath = $args[0]

# Ergibt zusammen mit "$snipRoot" den vollen Pfad zum Stammverzeichnis mit den Digitalisaten bzw. mets.xml-Dateien
$path = $snipRoot + $relPath


# Ins Start-Verzeichnis wechseln
PUSHD $path

Write-Host 
Write-Host 
Write-Host ---------------- Modify-Infos-in-XML_METS.ps1 ----------------
Write-Host Parameter fuer Korrektur MAX nach DEFAULT in mets.xml-Dateien:
Write-Host 
Write-Host Start-Pfad: $path
Write-Host 
Write-Host Start mit beliebiger Taste ...
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
#Start-Sleep -s 5

 
Write-Host "Schritt 1: Ermittele alle Verzeichnisse, bitte Geduld ..."

# Schnelle Variante: "-Filter" wirkt direkt auf die initiale Ermittlung von Objekten.
# Es knnen aber nur die Wildcards der CMD-Engine (*,.,?) verwendet werden. also wie bei DIR /B /S *.
# $colFolder = Get-ChildItem -Filter "*." -recurse | Sort-Object Fullname 

# -Filter "*." funktioniert unter PS 4.0 (Windows 2012 R2) nicht mehr,- es werden damit keine Objekte ermittelt,
# daher Nutzung von PowerShell 3.0 GCI -Directory Parameter: 
$colFolder = Get-ChildItem -directory -recurse | Sort-Object Fullname 

$VerbosePreference = "Continue"

Write-Host 
Write-Host "Schritt 2: Durchlaufe alle ermittelten Verzeichnisse ..."
Foreach ($strFolder In $colFolder)
{
	Trap [Exception] {
	Write-Debug $("TRAPPED: " + $_.Exception.Message);
	Continue
	}

	# Prfen, ob im Quellverzeichnis mets.xml vorhanden ist, nur dann weitere Schritte durchfhren!
	# $strFolder.FullName ergibt vollstndigen Pfad
	If (Test-Path($strFolder.FullName + "\mets.xml")) 
	{

		# Objekt-Referenz fr mets.xml-Datei
		$file = resolve-path($strFolder.FullName + "\mets.xml")

		# XML-Objekt erzeugen
		$xdoc = new-object System.Xml.XmlDocument

		# METS-Datei laden
		$xdoc.load($file)

		# Namespace bestimmen
		$ns = new-object Xml.XmlNamespaceManager $xdoc.NameTable
		$ns.AddNamespace("mets", "http://www.loc.gov/METS/")

		# --- Knoten mit leerer DEFAULT-Sektion lschen ---
		# Objektreferenz fr Knoten erzeugen, der gelscht werden soll
		$delnode = $xdoc.SelectSingleNode('//mets:fileSec/mets:fileGrp[@ID="mets-fgrp-00001"]', $ns)
		# Knoten lschen ...
		$delnode | %{ $_.parentnode.removechild($_) }

		# --- Knoten mit MAX-Attribut ndern ---
		# Knoten bestimmen ...
		$oElmnUse = $xdoc.SelectSingleNode('//mets:fileSec/mets:fileGrp[@USE="MAX"]', $ns)
		# Attribut ndern: MAX nach DEFAULT
		$OutNull = $oElmnUse.SetAttribute("USE", "DEFAULT")
		# Attribut zufgen: ID=mets-fgrp-00001
		$OutNull = $oElmnUse.SetAttribute("ID", "mets-fgrp-00001")

		# gendertes XML in mets.xml-Datei speichern
		$OutNull = $xdoc.Save($file)

		Write-Verbose "OK: $strFolder"
	} 
	else
	{
		Write-Verbose "bersprungen: $strFolder"
	}
 }

POPD

Write-Host Fertig. Fenster schliesst sich in 10 Sek. ...
Start-Sleep -s 10