Bestimmte Teile von XML Dateien kopieren
Hallo,
ich habe folgende Dateien über 10k:
Nun muss ich von allen Dateien eine Kopie erstellen in der die Projecte aber nicht vollständig übernommen werden sollen.
In meinem Fall sollen nur die Projekte mit kopiert werden die von ersteller id=2 mit dem name=Diana erstellt worden sind.
Sozusagen soll die Datei im separaten Ordner dann wie folgt aussehen:
So jede XML Datei finden ist ja kein Problem aber wenn es jetzt an das kopieren geht von den XML Daten habe ich keine Ahnung wie ich diese dann kopieren kann.
Meine Intention bei dem oberen Script wahr, ich erhalte erstmal wieviel project gesamt gefunden werden. Problem er gibt mir nur die KundenAnzahl aus in der mindestens einmal die richtige Kombigefunden wird und dann alle Einträge auch die nicht gewünschten.
Danke im voraus für eure Antworten.
Beste Grüße Markus
ich habe folgende Dateien über 10k:
<?xml version="1.0" encoding="utf-8"?>
<Data>
<Ortsangaben id="1">
<Ort id="0001" name="Musterstadt" plz="12345">
</Ortsangaben>
<Ortsangaben id="2">
<Ort id="0002" name="Musterhausen" plz="45678">
</Ortsangaben>
<Ortsangaben id="3">
<Ort id="0003" name="Spatzenhausen" plz="95123">
</Ortsangaben>
<Kundenzusatz id="1">
<Zusatz id="0001" betreff="linke Tür">
<Zusatzwichtig id="0001" betreff="Kunde wünsch DU Form">
</Kundenzusatz>
<Kundenzusatz id="2">
<Zusatz id="0002" betreff="linke Tür">
</Kundenzusatz>
<projects>
<project id="0001" name="Book1" date="2009-01-08">
<ersteller id="1" name="Kurt"/>
<editions>
<edition language="English">En.Book1</edition>
<edition language="German">Ge.Book1</edition>
<edition language="French">Fr.Book1</edition>
<edition language="Polish">Pl.Book1</edition>
</editions>
</project>
<project id="0002" name="Book2" date="2010-03-23">
<ersteller id="1" name="Kurt"/>
<editions>
<edition language="English">En.Book2</edition>
<edition language="German">Ge.Book2</edition>
<edition language="French">Fr.Book2</edition>
<edition language="Polish">Pl.Book2</edition>
</editions>
</project>
<project id="0003" name="Book3" date="2012-06-16">
<ersteller id="2" name="Diana"/>
<editions>
<edition language="English">En.Book3</edition>
<edition language="German">Ge.Book3</edition>
<edition language="French">Fr.Book3</edition>
<edition language="Polish">Pl.Book3</edition>
</editions>
</project>
<project id="0004" name="Movie1" date="2012-12-01">
<ersteller id="1" name="Kurt"/>
<editions>
<edition language="English">En.Movie1</edition>
<edition language="German">Ge.Movie1</edition>
<edition language="French">Fr.Movie1</edition>
<edition language="Polish">Pl.Movie1</edition>
</editions>
</project>
<project id="0005" name="Movie2" date="2013-01-15">
<ersteller id="2" name="Diana"/>
<editions>
<edition language="English">En.Movie2</edition>
<edition language="German">Ge.Movie2</edition>
<edition language="French">Fr.Movie2</edition>
<edition language="Polish">Pl.Movie2</edition>
</editions>
</project>
</projects>
</Data>
Nun muss ich von allen Dateien eine Kopie erstellen in der die Projecte aber nicht vollständig übernommen werden sollen.
In meinem Fall sollen nur die Projekte mit kopiert werden die von ersteller id=2 mit dem name=Diana erstellt worden sind.
Sozusagen soll die Datei im separaten Ordner dann wie folgt aussehen:
<?xml version="1.0" encoding="utf-8"?>
<Data>
<Ortsangaben id="1">
<Ort id="0001" name="Musterstadt" plz="12345">
</Ortsangaben>
<Ortsangaben id="2">
<Ort id="0002" name="Musterhausen" plz="45678">
</Ortsangaben>
<Ortsangaben id="3">
<Ort id="0003" name="Spatzenhausen" plz="95123">
</Ortsangaben>
<Kundenzusatz id="1">
<Zusatz id="0001" betreff="linke Tür">
<Zusatzwichtig id="0001" betreff="Kunde wünsch DU Form">
</Kundenzusatz>
<Kundenzusatz id="2">
<Zusatz id="0002" betreff="linke Tür">
</Kundenzusatz>
<projects>
<project id="0003" name="Book3" date="2012-06-16">
<ersteller id="2" name="Diana"/>
<editions>
<edition language="English">En.Book3</edition>
<edition language="German">Ge.Book3</edition>
<edition language="French">Fr.Book3</edition>
<edition language="Polish">Pl.Book3</edition>
</editions>
</project>
<project id="0005" name="Movie2" date="2013-01-15">
<ersteller id="2" name="Diana"/>
<editions>
<edition language="English">En.Movie2</edition>
<edition language="German">Ge.Movie2</edition>
<edition language="French">Fr.Movie2</edition>
<edition language="Polish">Pl.Movie2</edition>
</editions>
</project>
</projects>
</Data>
So jede XML Datei finden ist ja kein Problem aber wenn es jetzt an das kopieren geht von den XML Daten habe ich keine Ahnung wie ich diese dann kopieren kann.
##foreach Schleife für Datei Auslesen{
[xml]$KD=Get-Content $dateipfad
if($KD.Data.projects.project.ersteller.id -eq $suchbegriff_id -and $KD.Data.projects.project.ersteller.id -eq $suchbegriff_name){
echo $KD.Data.projects.project
echo $KD.Data.projects.project.ersteller.id
echo $KD.Data.projects.project.ersteller.name
$numbers++
echo "Aktuelle Zeile:" $numbers
}
##}
Meine Intention bei dem oberen Script wahr, ich erhalte erstmal wieviel project gesamt gefunden werden. Problem er gibt mir nur die KundenAnzahl aus in der mindestens einmal die richtige Kombigefunden wird und dann alle Einträge auch die nicht gewünschten.
Danke im voraus für eure Antworten.
Beste Grüße Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 53231100801
Url: https://administrator.de/forum/bestimmte-teile-von-xml-dateien-kopieren-53231100801.html
Ausgedruckt am: 19.03.2025 um 09:03 Uhr
6 Kommentare
Neuester Kommentar

# quellordner
$quelle = "D:\Daten"
# zielordner
$ziel = "D:\Ziel"
foreach($file in Get-ChildItem $quelle -File -Filter *.xml){
# xml object
$xml = New-Object XML
# xml laden
$xml.Load($file.Fullname)
# unerwünschte Knoten löschen
$xml.data.projects.project | ?{!($_.ersteller.id -eq 2 -and $_.ersteller.name -eq 'Diana')} | %{$_.parentNode.removeChild($_)}
# alternative Variante mit Zuweisung statt Entfernung der Knoten
# $xml.data.projects.InnerXml = $xml.data.projects.project | ?{$_.ersteller.id -eq 2 -and $_.ersteller.name -eq 'Diana'} | %{$_.outerXML}
# unter dem Zielpfad speichern
$xml.Save((Join-Path $ziel $file.Name))
}

$xml.data.projects.project | ?{$_.ersteller.id -eq 2 -and $_.ersteller.name -eq 'Diana'} | %{
$_.ersteller.id = '1'
$_.ersteller.name = 'Kurt'
}

%{} ist ein Alias für ForEach-Object das was in den Klammern steht wird für jedes Objekt in der Pipeline ausgeführt
?{} is ein Alias für Where-Object womit man die gewünschten Objekte auf ein Set anhand von Kriterien begrenzen/reduzieren kann
?{} is ein Alias für Where-Object womit man die gewünschten Objekte auf ein Set anhand von Kriterien begrenzen/reduzieren kann