Jump to content

Powershell V.5.1: Problem XML Nodes zusammenfügen


Direkt zur Lösung Gelöst von Manestrum,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

 

Link zu diesem Kommentar
  • Beste Lösung

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 :) 

Link zu diesem Kommentar

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.

 

Link zu diesem Kommentar
Geschrieben (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 von Manestrum
Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...