Manestrum 1 Geschrieben 19. Mai Melden Teilen Geschrieben 19. Mai Hallo liebe Community, ich schreibe aktuell an einem Skript, welches CSV-Dateien aus Unterordnern in einen Hauptordner kopiert und zusammenfügt. In jedem Unterordner existiert auch eine XML-Datei, welche für eine spätere Verwendung die Überschriften der CSV-Dateien beinhaltet. Einige CSV-Dateien sind nicht in jedem Unterordner enthalten, aber in der dazugehörigen XML-Datei. Ich möchte daher die XML-Dateien auch zusammenfügen. Die XML-Datei hat folgende Knoten: DataSet/Media/Table - In Table ist alle für die jeweilige CSV-Datei als Element erfasst. Es existieren keine Attribute. Ich möchte nur die fehlenden Table in der Hauptxml-Datei einfügen. Mein Problem ist das Einfügen der kopierten Node aus der Primären-Datei in die Sekundäre-Datei. Bei folgendem Code bekomme ich den unten aufgeführten Fehler. Die Google Suche hat mich nicht weitergebracht. $global:PrimaerDaten = New-Object System.XML.XMLDocument $global:PrimaerDaten.Load("") # Wurde für den Thread entfernt. $global:SekundaerDaten = New-Object System.XML.XMLDocument $global:SekundaerDaten.Load("") # Wurde für den Thread entfernt. $BName = "'Mitarbeiterdaten.Arbeitszeiten'" $xpath = "//Table[Name=" + $BName + "]" $item = Select-Xml $PrimaerDaten -Xpath ($xpath) $item.Node.ParentNode.Name $newnode = $item.Node.CloneNode($true) $Media = Select-XML -Xml $SekundaerDaten -XPath '/DataSet/Media' #$Media.Node.InsertAfter($newnode, "Datenträger") # Wurde von mir verwendet für Testzwecke, da das Parentelement wohl nicht Media ist sondern Datenträger $Media.Node.AppendChild($newnode) - Hier tritt der Fehler auf. Fehler: __________________________________________________________________________________________________________________________________ Ausnahme beim Aufrufen von "AppendChild" mit 1 Argument(en): "Der einzufügende Knoten stammt aus einem anderen Dokumentenkontext." In:22 Zeichen:1 + $Media.Node.AppendChild($newnode) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DotNetMethodException __________________________________________________________________________________________________________________________________ Ich hoffe jemand kann mir mein Problem erläutern und erklären. Freundliche Grüße Zitieren Link zu diesem Kommentar
Beste Lösung Manestrum 1 Geschrieben 19. Mai Autor Beste Lösung Melden Teilen Geschrieben 19. Mai Hallo, ich kann den Eintrag schließen.. Nach einziger Zeit des Suchens habe ich eine Lösung gefunden, welche bei mir funktioniert. $global:PrimaerDaten = New-Object System.XML.XMLDocument $global:PrimaerDaten.Load("") #Pfad entfernt. $global:SekundaerDaten = New-Object System.XML.XMLDocument $global:SekundaerDaten.Load("") #Pfad entfernt. $parent = $SekundaerDaten.SelectSingleNode("DataSet/Media") # enumerate source nodes foreach ($localNode in $PrimaerDaten.SelectNodes("/DataSet/Media/Table")) { # check if node exists in destination $serverNode = $parent.SelectSingleNode("//Table[Name='$($localNode.Name)']") # remove if exists if ($serverNode) { [void]$parent.RemoveChild($serverNode) } # append from source [void]$parent.AppendChild($SekundaerDaten.ImportNode($localNode, $true)) } Obiger Code prüft ob der Eintrag schon vorhanden ist, löscht ihn und fügt ihn neu hinzu. Dadurch erzeuge ich keine Duplikate und bekomme auch die neuen Einträge hinzu. Das ganze hat mich bestimmt drei Wochen gekostet. :) Da ich nicht weiß, wie ich den Thread schließe: @Mods bitte schließen. :) Ich poste meine Lösung, falls andere Leute die gleichen Probleme haben könnten. Freundliche Grüße :) 1 Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben 19. Mai Melden Teilen Geschrieben 19. Mai XML hat per se kein "Eintrag bereits vorhanden", es gibt keinen "Primary Key", der eindeutig sein muß. "Duplikate" sind explizit nicht verboten. So gesehen mußt Du das so lösen Und falls Du mal wieder so ein Problem hast: Ohne Sample Data ist da schwer zu helfen. Ich verstehe z.B. nicht, was Du meinst mit vor 4 Stunden schrieb Manestrum: Einige CSV-Dateien sind nicht in jedem Unterordner enthalten, aber in der dazugehörigen XML-Datei. Zitieren Link zu diesem Kommentar
Manestrum 1 Geschrieben 19. Mai Autor Melden Teilen Geschrieben 19. Mai (bearbeitet) vor 11 Minuten schrieb daabm: XML hat per se kein "Eintrag bereits vorhanden", es gibt keinen "Primary Key", der eindeutig sein muß. "Duplikate" sind explizit nicht verboten. So gesehen mußt Du das so lösen Und falls Du mal wieder so ein Problem hast: Ohne Sample Data ist da schwer zu helfen. Ich verstehe z.B. nicht, was Du meinst mit Die index.xml Datei enthält einen Verweis auf die im jeweiligen Ordner vorhandenen *.csv Dateien und weitere Details. Ordner A = A.csv, B.csv, C.csv, index.xml Ordner B = A.csv, B.csv, C.csv, D.csv, index.xml Ordner C = X.csv, B.csv, index.xml Das Skript fügt die CSV-Dateien von Ordner A, B und C durch Get-Content und Set-Content in Ordner D zusammen, Ordner D = A.csv, B.csv, C.csv, D.csv, X.csv | Würde ich jetzt die index.xml aus Ordner B kopieren hätte ich später keine Informationen über die X.csv-Datei. Somit muss ich die index.xml Dateien verschmelzen ohne das Werte doppelt vorkommen. :) Danke aber für deine Erläuterung mit dem "PrimaryKey". :) Das hilft meinem Verständnis schon mehr auf die Sprünge als vorher. :) bearbeitet 19. Mai von Manestrum Zitieren Link zu diesem Kommentar
daabm 1.366 Geschrieben 19. Mai Melden Teilen Geschrieben 19. Mai Hm - mein Bauchgefühl sagt, daß da das Datenmodell "nicht optimal" ist (man könnte auch flapsig sagen #grütze), aber wer bin ich, daß ich das remote beurteilen könnte Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.