dirmhirn
Goto Top

XML Join mit Powershell - speedup?

Hi,

ich muss zwei Tabellen in XML Form mit einer 1:n-Verbindung verknüpfen. (d.h. es geht nicht darum zwei XML Dateien zusammenzufügen)

Mit Powershell konnte ich das soweit umsetzen. Ich geh alle Nodes der größeren XML Datei durch und suche jedesmal in der kleineren den entsprechenden Node.

Die Performance ist ok... 150k Nodes in 15min
Ein Ansatz wäre XmlReader statt XmlDocument zu nutzen da hier ein Index erstellt werden kann. Aber das scheint deutlich aufwendiger zu werden als mit XmlDocument.

Gibt es auch mit XmlDocument einen schnelleren Weg, um einen Node mit bestimmtem ChildNode zu finden?

<root>
  <node>
     <id>
     <detail1>
     <detail2>
  <node>
...

#$ID-node, tag Name des Nodes mit der entprechenden ID.
#xmlsrc, Info
#xmldst, hier sind viele Nodes mit einem ID Feld über das der entsprechende Eintrag aus xmlsrcgeuscht werden soll

foreach ($node in $xmldst.SelectNodes(./root/node)) {

	# ID in dest
	$search= $node.SelectSingleNode(./id).InnerText
	
	# search id in source file
	$nodesrc = $xmlsrc.SelectSingleNode(./rootsrc/node/[./id =  $search]) # diese Zeile optimieren?

        #alle ChildNodes des gefunden Nodes in XMLdest kopieren
...

sg Dirm

Content-ID: 282497

Url: https://administrator.de/forum/xml-join-mit-powershell-speedup-282497.html

Ausgedruckt am: 02.04.2025 um 03:04 Uhr

122990
Lösung 122990 10.09.2015 aktualisiert um 13:05:35 Uhr
Goto Top
Moin,
schon mal mit diesem XPath probiert ?
"./rootsrc/node/id[.= '$search']"
Gruß grexit
Dirmhirn
Dirmhirn 10.09.2015 um 13:05:31 Uhr
Goto Top
Hi grexit,

danke für den Tip - weitere -%5 bei der Gesamtdauer.

fand es auch etwas überraschend, das //node deutlich langsamer (~50%) ist als ./rootsrc/node obwohl die Datei nur aus diesen Nodes besteht....

sg Dirm
Dirmhirn
Dirmhirn 21.09.2015 um 11:40:41 Uhr
Goto Top
Hi,
Hast du Erfahrung mit indizierten XML-Dateien oder ob CSV-Dateien schneller durchsucht werden können? Im Web finden sich einige Beiträge zu indizierten XML Dateien, der Code ist aber deutlich aufwendiger.
Irgendwie befürchte ich aber auch, dass ich hier an die Grenzen von Skript-Sprachen stoße.
sg Dirm
122990
122990 21.09.2015 um 12:46:12 Uhr
Goto Top
Moin,
lade die XML doch in ein In-Memory-Database (DataTable-Objekt), filtere sie und gebe sie wieder aus.
https://msdn.microsoft.com/de-de/library/fs0z9zxd(v=vs.110).aspx

Gruß grexit