samvanratt
Goto Top

Zeilenersatz in xml Datei mit vielen Sonderzeichen

Hallo zusammen
ich hänge gerade an einer Vereinfachung xml Dateien automatisch anzupassen.
Bisher wurden xml Template Dateien manuell editiert um eine Zeile anzupassen und deren eigenen Namen einzufügen.
Aufbau ist:

cat "Franz Haidar-.xml"

Beispiel "1"
Beispiel "2 1 Sonderzeichen"
FILE "FILENAMEN HIER EINTRAGEN.xml" UTF16
Beispiel "3 9 Sonderzeichen"
...

Oft wird dies vergessen und einige unserer Parser/Interpreter streiken dann weil sie den Namen nicht finden.

Ich will nun die Zeile
FILE "FILENAMEN HIER EINTRAGEN.xml" UTF16
vereinfachen indem ich mit einer FOR Schleife alle xml abfange und deren Name eintrage oder zumindest finde. Damit liegt der FILENAME als Variable vor und soll damit

FILE "FILENAMEN HIER EINTRAGEN.xml" UTF16

mit einem
"
sed -i "s/^FILE.*/FILE $SAMZ/" "$SAMZ"
"
wobei
SAMZ="Franz Haidar-.xml"

geht das schon Ansatzweise, aber leider gibt es Milliarden Sonderzeichen wie " oder ' oder : oder White spaces oder Klammern oder oder oder. Auch der Characterset ist von CP1252 über 1250 zu UTF8 bis 32 erlaubt (also auch Laute wie ř)

Ab da ist mein sed/awk Wissen komplett am Ende.

Ich habe bisher 500 solcher Dateien gefunden welche falscch formatiert sind. Per Hand bin ich da in 4h durch, aber das Problem kommt ja immer wieder.

Hat da jemand einen Lösungsvorschlag? Ein GNU awk, sed, grep und co stehen zur Auswahl; kein perl und Co. OS darunter ist ein Win2019 mit GNU Toolset.
Gruß
Sam

Content-Key: 7090373855

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

Printed on: April 27, 2024 at 05:04 o'clock

Member: Crusher79
Crusher79 May 10, 2023 at 07:28:20 (UTC)
Goto Top
Hallo,

wo sind wir? sed - also Linux Server?

Ist das ein Dauerzustand oder bleibt es bei 500 und ein paar zerquetschten?

Mirth Connect

Apache Camel

Mit Mirthconnect lassen sich über die Kanäle auch Ausgaben manipulieren. Gesundheitswesen darf einen nicht schrekcen. Man muss ja nicht h7 nutzen. Apache Camel ist auch ganz Groß.

Man hat Log Dateien. Kann einen Webserice rasch aufbauen oder die Dateien auf File Ebene/ via TCP o.ä. versenden.


Darum erstmal die Frage nach dem Betriebssytem und der Größe. Das Schöne an Mirth Connect u.ä. ist, dass man einfach belegen kann was wohin umgesetzt wurde. Oder eben warum nicht.


Ansonsten hast du hier auch viele PowerShell Beispiele. PS gibt es ja auch für Linux. Ggf. kommst du damit schnell zum Ziel. Bzw. kann man es einfach von Windows auf Linux übertragen. Den Code unter Windows schreiben und später auf Linux ausführen.

mfg Crusher
Mitglied: 7010350221
7010350221 May 10, 2023 updated at 10:58:51 (UTC)
Goto Top
Hi
Der Post ist echt verwirrend geschrieben musste das 10 mal lesen bevor mir einigermaßen klar war was gemeint ist, zumal das keinerlei korrekte XML-Syntax war ... face-sad

Wenn man eh auf einem Windows Server arbeitet dann doch gleich Bordmittel z.B. unten stehendes Powershell mit einem vernünftigen Parser einsetzen statt dieses bei XML gefährliche "String-Replace" zu benutzen!

Ein Beispiel für eine XML-Datei mit folgendem Aufbau:
<?xml version="1.0" encoding="utf-8"?>
<root>
    <FILE>Dateiname_2342j34ljl2jk43.xml</FILE>
</root>
Dann ersetzt das folgende Powershell-Skript den Inhalt jedes XML-Files in einem Ordner bei welcher der Knoten nicht mit dem Dateinamen übereinstimmt, den Inhalt des Knotens durch den aktuellen Dateinamen dieser Datei
# Jede Datei bei dem der Knoten "/root/FILE" nicht mit dem Dateinamen übereinstimmt verarbeiten 
foreach($file in Get-ChildItem 'D:\Ordner' -File -Filter *.xml | ?{(Select-XML $_.Fullname -XPath '/root/FILE').Node.innerText -ne $_.Name}){  
    # XML Datei in XML-Document-Object laden 
    # (Die Load-Methode erkennt im Gegensatz zur Verwendung von Get-Content das korrekte Encoding der XML-Datei!)
    $xml = New-Object XML
    $xml.Load($file.Fullname)
    # Inhalt des Knotens durch Dateinamen ersetzen
    $xml.root.FILE = $file.Name
    # XML Datei wieder speichen
    $xml.Save($file.Fullname)
}
So sind auch Sonderzeichen kein Thema mehr.

Hoffe das war jetzt am Ende richtig interpretiert. Würde aber dringend dazu raten den Post dahingehend nochmal zu überarbeiten, würdest du sicher mehr Feedback damit erhalten. Danke!

Gruß
Member: SamvanRatt
SamvanRatt May 11, 2023 at 11:04:04 (UTC)
Goto Top
Hallo Crusher79
die fehlerhaften xml's sammeln sich an, da mein Parser nicht den technischen Inhalt prüft.
Mein Ziel ist es aber es in ein Bereinigungsskript aufnehme (als Einzeiler, da alle anderen Aufgaben auch schon so laufen) und kein Toolset oder gar Dienst installiere. sed und awk können das sicher; meine obere Zeile kommt ja schon gut hin, aber der Inhalt mit den ganzen Steuerzeichen ' " % $ & white Spaces, UTF16 Zeichen, UND dem Umstand das in den Ersatztext ein ... macht es für mich zu einer Escape Unmöglichkeit, zumindest mit meinem Wissen dazu.
Mein bester Ansatz war bisher die Zeile FILE* mittels grep zu löschen und dann in einem zweiten Schritt den festen Satz einzufügen, was mit simplen echo richtig gut geht; schön ist das aber nicht und die erlaubten Steuerzeichen im Filenamen mag echo auch nicht überall.
Gruß
Sam
Member: SamvanRatt
SamvanRatt May 11, 2023 at 11:14:07 (UTC)
Goto Top
Hi Ultramatic
sorry für das verwirrende (wenn du mir sagst was dich gestört hat ist das ausgebessert).
Das Skript muss nicht nur unter Win laufen sondern allen unserer Webserver und das sind typ. Linux/BSD Maschinen; ein Win Maschine aber als Bereinigungshost zu nutzen ginge aber immer, sofern es seinen Zweck erfüllt. Die GNU Tools haben wir aber überall dabei (meist muss man aber kleinere Anpassungen machen wie Variablen; trotzdem der beste gemeinsame Grund und nicht umsonst seit 25 JAhren hier so Vorgabe man solle sich doch daran halten).

Powershell ist bei uns (gesperrter Download im Officenetz) wegen der Plugins/cmdlets gar nicht genutzt; deine Vorlage aber schon (fast) wo ich hinwill, daher ein Superstart für mich. Bin gespannt wie das mit den Steuerzeichen aussieht, denn im Filenamen darf sich alles tummeln was NTFS/ZFS/ext4/UFS erlaubt. Wir haben leider auch Mac User und das Fragezeichen ist da schon so ein Thema zum Kopfzerbrechen; zum Glück fallen die nicht in meinen Bereich.
Ich gehe mit deiner Vorlage mal ins Rennen und reporte zurück wie es damit durchlief.
Gruß
Sam
Mitglied: 7010350221
7010350221 May 11, 2023 updated at 12:29:06 (UTC)
Goto Top
Bin gespannt wie das mit den Steuerzeichen aussieht, denn im Filenamen darf sich alles tummeln was NTFS/ZFS/ext4/UFS erlaubt.
Die sind wie gesagt kein Problem da das XMLDocument-Object das korrekt handelt und bei Bedarf das schon von selbst XML gerecht escaped.
Und btw. läuft die PS natürlich auch unter Linux.
XML Dateien sollte man aus diesen und anderen Gründen automatisiert immer mit einem vernünftigen Parser bearbeiten, denn sonst besteht die Gefahr eine invalide XML zu erzeugen.