markusboehm
Goto Top

Bestimmte Teile von XML Dateien kopieren

Hallo,
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

Content-Key: 53231100801

Url: https://administrator.de/contentid/53231100801

Printed on: June 16, 2024 at 00:06 o'clock

Mitglied: 10138557388
Solution 10138557388 Dec 18, 2023 updated at 14:36:49 (UTC)
Goto Top
# 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))
}
pj
Member: MarkusBoehm
MarkusBoehm Dec 20, 2023 at 12:10:54 (UTC)
Goto Top
Zitat von @10138557388:

# 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))
}
pj

Danke für die schnelle Antwort, hat zwar etwas gebraucht bis ich es verstanden habe aber jetzt geht es.
Member: MarkusBoehm
MarkusBoehm Dec 20, 2023 updated at 12:19:59 (UTC)
Goto Top
Könnte ich jetzt auch in einer zweiten Abfrage die gefundenen Zeilen und Dateien wie folgt bearbeiten?
foreach($file in Get-ChildItem $ziel -File -Filter *.xml){
    $xml = New-Object XML
    $xml.Load($file.Fullname)
    $xml.data.projects.project | ?{($_.ersteller.id -eq 2 -and $_.ersteller.name -eq 'Diana')} | SET  $_.ersteller.id=1 -and $_.ersteller.name='Kurt'  
    $xml.Save((Join-Path $ziel $file.Name))
}
Die negierung ! habe ich schon entfernt aber wie sage ich setzte oder Update bitte die Inhalte.
Mitglied: 10138557388
10138557388 Dec 20, 2023 at 12:25:41 (UTC)
Goto Top
$xml.data.projects.project | ?{$_.ersteller.id -eq 2 -and $_.ersteller.name -eq 'Diana'} | %{  
    $_.ersteller.id = '1'  
    $_.ersteller.name = 'Kurt'  
}
Member: MarkusBoehm
MarkusBoehm Dec 20, 2023 at 12:28:39 (UTC)
Goto Top
Zitat von @10138557388:

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

nur für mein Verständins, das % Zeichen ist immer gedacht das es ausgeführt wird?
Mitglied: 10138557388
10138557388 Dec 20, 2023 updated at 12:34:20 (UTC)
Goto Top
%{} 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