Manipulation von XML Dateien - Werte Zuordnung zwischen zwei Dateien
Hallo zusammen,
ich habe eine Frage bzgl. Manipulation von XML Dateien. Da ich auf diesem Gebiet sehr neu bin und eine relativ schnelle Lösung bräuchte, benötige ich eure Hilfe.
Problemstellung:
- Ich habe zwei XML Dateien. Zuordnungen aus der einen Datei sollen gelesen werden und in die andere XML Datei als Wert geschrieben werden. Dies bezüglich hatte ich schon mehrmals
gelesen, dass sich vbs am besten eignet. Ist dies richtig?
1. Datei: C:\XML\Holz.xml (als Bild in den Anhang gelegt)
- In der Holz.xml findet man unter <HZID> bei dem <Namen> Eiche_TL_BA die Nummer 2
- Diese ID müsste gespeichert werden und anschließend muss geguckt werden, welcher Wert zur ID 2 gehört.
- Dies sieht man unten -> <Value>1.0. Dies müsste jetzt auch gespeichert werden.
- Nun weiß man, dass der Wert 1.0 zum Namen Eiche_TL_BA gehört. Diese Zuordnung soll in die Datei Sorten.xml
hinzugefügt werden.
2. Datei :C\XML\Sorten.xml (als Bild in den Anhang gelegt)
- In dieser Sorten.xml müssen die Wert Zuordnungen zu den jeweiligen Namen jetzt übernommen werden.
- Das heißt, dass ich aus der der Holz.xml nun weiß, dass zum Namen Eiche_TL_BA der value 1.0 gesetzt ist und diesen möchte ich jetzt auch gerne in meine Sorten.xml eintragen. Dazu müsste ich
nach dem in diesem Fall elementName suchen und nach Übereinstimmung fragen und danach den value unter <Numeric> von 0 auf 1 setzen. Dies möchte ich mit allen Namen machen, die ich in
der Holz.xml finde. Auch z.B. in diesem Fall mit Birke_TL_BA.
Jetzt bräuchte ich eure Hilfe. Hat jemand eine Möglichkeit, wie ich dies am elegantesten lösen könnte? Vielen vielen Dank schon einmal!!!
ich habe eine Frage bzgl. Manipulation von XML Dateien. Da ich auf diesem Gebiet sehr neu bin und eine relativ schnelle Lösung bräuchte, benötige ich eure Hilfe.
Problemstellung:
- Ich habe zwei XML Dateien. Zuordnungen aus der einen Datei sollen gelesen werden und in die andere XML Datei als Wert geschrieben werden. Dies bezüglich hatte ich schon mehrmals
gelesen, dass sich vbs am besten eignet. Ist dies richtig?
1. Datei: C:\XML\Holz.xml (als Bild in den Anhang gelegt)
- In der Holz.xml findet man unter <HZID> bei dem <Namen> Eiche_TL_BA die Nummer 2
- Diese ID müsste gespeichert werden und anschließend muss geguckt werden, welcher Wert zur ID 2 gehört.
- Dies sieht man unten -> <Value>1.0. Dies müsste jetzt auch gespeichert werden.
- Nun weiß man, dass der Wert 1.0 zum Namen Eiche_TL_BA gehört. Diese Zuordnung soll in die Datei Sorten.xml
hinzugefügt werden.
2. Datei :C\XML\Sorten.xml (als Bild in den Anhang gelegt)
- In dieser Sorten.xml müssen die Wert Zuordnungen zu den jeweiligen Namen jetzt übernommen werden.
- Das heißt, dass ich aus der der Holz.xml nun weiß, dass zum Namen Eiche_TL_BA der value 1.0 gesetzt ist und diesen möchte ich jetzt auch gerne in meine Sorten.xml eintragen. Dazu müsste ich
nach dem in diesem Fall elementName suchen und nach Übereinstimmung fragen und danach den value unter <Numeric> von 0 auf 1 setzen. Dies möchte ich mit allen Namen machen, die ich in
der Holz.xml finde. Auch z.B. in diesem Fall mit Birke_TL_BA.
Jetzt bräuchte ich eure Hilfe. Hat jemand eine Möglichkeit, wie ich dies am elegantesten lösen könnte? Vielen vielen Dank schon einmal!!!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 348221
Url: https://administrator.de/contentid/348221
Ausgedruckt am: 22.11.2024 um 11:11 Uhr
19 Kommentare
Neuester Kommentar
Servus,
würde ich heutzutage eher XSLT oder Powershell dafür benutzen, hier ein Powershell-Skript:
Grüße Uwe
würde ich heutzutage eher XSLT oder Powershell dafür benutzen, hier ein Powershell-Skript:
$xml_holz = [xml](gc 'C:\XML\Holz.xml')
$xml_sorten = [xml](gc 'C:\XML\sorten.xml')
$xml_holz.SelectNodes("//HZDef/HZID") | %{
$name = $_.nextSibling.'#text'
[string]$value = $xml_holz.SelectSingleNode("//HZZ/HZ[HZID-Ref = $($_.'#text')]/Value").'#text'
$xml_sorten.SelectSingleNode("//DataEntry[@elementName = '$name']") | %{$_.DataVariant.ScalarType.Numeric.value = $value}
}
$xml_sorten.Save('C:\XML\sorten.xml')
Schau mal genau in deinen XML-Code im einen Knoten schreibst du den übergeordnertenKnoten HZS und im anderen HZZ, das ist dein Fehler, da kann der XPath String ja nicht mehr passen .
Wenn du beide übergeordnete Knotennamen (HZZ/HZS) berücksichtigen musst, musst du das auch sagen!
Wenn das kein Schreibfehler von dir ist und du beide Knotenarten berücksichtigen willst schreibst du Zeile 6 so um
Als Lektüre zu XPath empfehle ich dir folgende Seite
https://www.w3schools.com/xml/xpath_syntax.asp
Wenn du beide übergeordnete Knotennamen (HZZ/HZS) berücksichtigen musst, musst du das auch sagen!
Wenn das kein Schreibfehler von dir ist und du beide Knotenarten berücksichtigen willst schreibst du Zeile 6 so um
[string]$value = $xml_holz.SelectSingleNode("//HZ[HZID-Ref = $($_.'#text')]/Value").'#text'
Als Lektüre zu XPath empfehle ich dir folgende Seite
https://www.w3schools.com/xml/xpath_syntax.asp
Zitat von @FRANHE:
Vielen Dank, Uwe.
Eine Sache wundert mich jetzt aber dennoch.
Wenn als Attribut im root Element der Namespace durch das xmlns angegeben ist funkioniert dein Skript nicht mehr.
Vollkommen normal das es dann nicht mehr geht, denn mit Namespace muss man den Namespace bei den XPath Selections mit angeben! XML ist da sehr pingelig.Vielen Dank, Uwe.
Eine Sache wundert mich jetzt aber dennoch.
Wenn als Attribut im root Element der Namespace durch das xmlns angegeben ist funkioniert dein Skript nicht mehr.
Such einfach mal nach "Namespacemanager" in meinen Beiträgen, das habe ich hier schon sehr oft gezeigt wie das mit Namespaces geht.
Nun ja du verwendest nur einen Namespacemanager für die holz XML bei der Abfrage in Zeile 11 verwendest du aber den Namespacemanager der Holz XML bei der Sorten-XML und da die einen anderen bzw. keinen Namespace verwendet kann er auch keine Nodes finden wenn du dort den Prefix anwendest!
Also wenn du bei der Sorten-XML einen anderen Namespace hast entweder einen zusätzlichen Namespacemanager für die Sorten-XML anlegen und auf diesen bei SelectSingleNode verweisen inkl. passendem Prefix oder wenn du keinen Namespace dort hast keine Prefixe im XPath verwenden.
Also wenn du bei der Sorten-XML einen anderen Namespace hast entweder einen zusätzlichen Namespacemanager für die Sorten-XML anlegen und auf diesen bei SelectSingleNode verweisen inkl. passendem Prefix oder wenn du keinen Namespace dort hast keine Prefixe im XPath verwenden.
Du hast in Zeile 10 den Node HZID-Ref nicht mit dem Prefix versehen . Deswegen findet er keinen Node und somit hat die Variable auch keinen Wert, Ergo: Leer.
Einfach schritt für Schritt kommentieren und die Variablen auf der Konsole ausgeben lassen oder die XPath Selections manuell testen, so lernst du am meisten von der Powershell diesem Thread,
Einfach schritt für Schritt kommentieren und die Variablen auf der Konsole ausgeben lassen oder die XPath Selections manuell testen, so lernst du am meisten von der Powershell diesem Thread,
p.s. es gibt hier Code-Tags für deinen Quellcode:
Hier mit Kommentaren für jede Zeile:
Hoffe das war es jetzt für diesen Fred.
Grüße Uwe
p.s. sorry das ich im Moment nicht immer zeitnah antworten kann da ich gerade sozusagen im "Outback" bin und nicht immer Zugang zum Web habe.
Dankesgrüße können wie immer hier abgeladen werden .
<code> Quellcode </code>
. Da ist leichter für uns da wir sonst den Code nicht kopieren können.Hier mit Kommentaren für jede Zeile:
# für jeden Unterordner von 'C:\XML'
gci 'C:\XML' -Directory | %{
# öffnen der Sorten.xml
$xml_sorten = [xml](gc "$($_.Fullname)\Sorten.xml")
# Für jede XML-Datei im Holz-Ordner
gci "$($_.Fullname)\Holz\*.xml" | %{
# XML in Objekt laden
$xml_holz = [xml](gc $_.Fullname)
# Namespacemanager erstellen
$ns = new-Object System.Xml.XmlNamespaceManager $xml_holz.NameTable
$ns.AddNamespace("ns",$xml_holz.DocumentElement.NamespaceURI)
# Für jeden HZID Knoten ...
$xml_holz.SelectNodes("//ns:HZDef/ns:HZID",$ns) | %{
# speichere Name in Variable
$name = $_.nextSibling.'#text'
# hole Wert mit Referenz auf HZID Wert und speichere diesen in Variablen '$value''
[string]$value = $xml_holz.SelectSingleNode("//ns:HZZ/ns:HZ[ns:HZID-Ref = $($_.'#text')]/ns:Value",$ns).'#text'
# setze die Info in die sorten.xml
$xml_sorten.SelectSingleNode("//DataEntry[@elementName = '$name']",$ns) | %{$_.DataVariant.ScalarType.Numeric.value = $value}
}
}
# Speichern der Sorten.xml
$xml_sorten.Save($_.Fullname)
}
Grüße Uwe
p.s. sorry das ich im Moment nicht immer zeitnah antworten kann da ich gerade sozusagen im "Outback" bin und nicht immer Zugang zum Web habe.
Dankesgrüße können wie immer hier abgeladen werden .