macewindu
Goto Top

In einer xml Zeichenlängen größer als 60 Zeichen finden

Hallo,
Habe eine XML mit etwa 2.2 Mio Zeilen. Darin stehen unter anderem sehr viele Zeilen die wie nachstehend lauten:

<bez id="ARTIKELNAME 1                                               "></bez>  

Ich möchte innerhalb der Anführungszeichen alle Zeichenlängen länger als 60 Zeichen finden. Die Bezeichnung ARTIKELNAME 1 ist jetzt nur ein Beispiel für wechselnde Artikelnamen. Zwischen dem letzten Zeichen 1 und dem zweiten Hochkomma befinden sich Leerzeichen, die sollen nicht mitgezählt werden. Leerzeichen zwischen ARTIKELNAME und 1 sollen schon mitgezählt werden.

Hat wer eine Ahnung wie man das bewerkstelligen kann?
Danke im Voraus,
MaceWindu

Content-Key: 501565

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

Printed on: May 2, 2024 at 05:05 o'clock

Member: erikro
erikro Oct 04, 2019 updated at 12:25:22 (UTC)
Goto Top
Moin,

das XML sieht so aus:

<?xml version="1.0"?> 
<artikel>
<bez id="Artikel 1                         "></bez> 
<bez id="Artikel noch einer                         "></bez> 
<bez id="Artikel und ein ganz langer                         "></bez> 
</artikel>

Und dann die Powershell:

[xml]$xml = Get-Content .\artikel.xml
$art = $xml.artikel.bez
foreach($item in $art) {
   # edit: das muss gar nicht sein $string = $item.id.trim()
   # edit: write-host $item.id.trim() "has" $string.length "chars" 
   # edit:
   write-host $item.id.trim() "has" $item.id.trim().length "chars"  
}

Ausgabe:
Artikel 1 has 9 chars
Artikel noch einer has 18 chars
Artikel und ein ganz langer has 27 chars

Jetzt noch ein kleines if darum, das das Ganze nach länger als 60 Zeichen filtert und in ein neues xml schreiben.

hth

Erik
Member: MaceWindu
MaceWindu Oct 04, 2019, updated at Aug 03, 2021 at 10:25:22 (UTC)
Goto Top
Hallo erikro,

Wow! Das sieht schon mal super aus. Sind die Zeilen untereinander angeordnet dann funktioniert es schon mal als Bildschirmausgabe. Was du als "kleines if" bezeichnest wird noch schwierig für mich face-wink
In meinem Fall klappt es zwar mit meiner XML noch nicht ganz. Ich denke das hat mit der Baumstruktur zu tun:

Der Wert "System.Object" kann nicht in den Typ "System.Xml.XmlDocument" konvertiert werden. Fehler: "Unerwartetes  
Token '<'. Erwartet wurde das Token '>'. Zeile 262, Position 1."  
In C:\Users\...\Desktop\msproject_zeichenlaenge.ps1:1 Zeichen:1
+ [xml]$xml = Get-Content .\artikel.xml
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) , RuntimeException
    + FullyQualifiedErrorId : InvalidCastToXmlDocument

Ich glaub ich könnte die Artikel-Zeilen vorher mit "TextCrawler" extrahieren. Das könnte klappen. Schau ich mir nä. Woche an. Schaff es heute nach über12h nicht mehr *hirntot*...

Vielen Dank!
Member: erikro
erikro Oct 05, 2019 at 11:01:56 (UTC)
Goto Top
Moin,

Du musst natürlich die XML-Abfrage auf Deine Struktur anpassen. Wenn das z. B. so aussieht:

<?xml version="1.0"?>  
<artikel>
   <artikelnummer nr=1>
     <bez id="Was auch immer       >  
     </bez>
   </artikelnummer>
</artikel>

Dann muss das im Skript so aussehen:

$art = $xml.artikel.artikelnummer.bez

Ganz einfach: Ein Element des XML sprichst Du an, indem Du alle Elternelemente aufzählst, die vorangehen. Ansonsten poste mal die Originalstruktur.

Und hier das kleine if:

foreach($item in $art) {
   if($item.id.trim().length -ge 60) {
      write-host $item.id.trim() "has" $item.id.trim().length "chars"  
   }
}

hth

Erik