Java replaceall regex (xml tags)

Mystery1988

Cadet 4th Year
Dabei seit
März 2015
Beiträge
121
Hallo zusammen,

ich brauche gerade ein größeren Denk anstoß.
Ich habe sehr viele verschiedene XML Dateien, die ich nicht mit einem xml Parser auslesen kann, da Sonderzeichen benutzt werden, die beim einlesen zu Fehlern führen.
Deswegen möchte ich unter dem Tag <title> nur noch bestimmte tags beibehalten.
Die Tags <en> und <de> sollen enthalten bleiben, diese beiden Tags können auch nur einzeln auftreten.

Aktuell wandle ich den Inputstream zu einem String um, um diesen mit replaceAll irgendwie zu manipulieren.

Denk anstöße reichen mir komplett aus =)

inputStreamString = inputStreamString.replaceAll("(?s)<description>.*<\\/description>", "");

Anbei die beiden xml Dateien.

XML:
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<modDesc descVersion="47">
    <version>1.01.00001</version>
    <author><![CDATA[devTeam]]></author>
    <title>
        <en>bla</en>
        <de>bla</de>
        <fr>bla</fr>
        <es>bla</es>
        <ru>bla</ru>
        <pl>bla</pl>
        <it>bla</it>
        <br>bla</br>
        <cs>bla</cs>
        <ct>bla</ct>
        <cz>bla</cz>
        <nl>bla</nl>
        <hu>bla</hu>
        <jp>bla</jp>
        <kr>bla</kr>
        <pt>bla</pt>
        <ro>bla</ro>
        <tr>bla</tr>
        <sl>bla</sl>
    </title>
    <multiplayer supported="true" />
    <iconFilename>img/store.dds</iconFilename>
    <l10n filenamePrefix="translations/translation" />
    <extraSourceFiles>
        <sourceFile filename="register.lua" />
    </extraSourceFiles>

    <actions>
        <action name="bla" axisType="HALF"  />
        <action name="bla" axisType="HALF"  />
        <action name="bla" axisType="HALF"  />
    </actions>

    <inputBinding>
        <actionBinding action="bla">
            <binding device="bla" input="" />
        </actionBinding>
    </inputBinding>
    <credits><![CDATA[
## Contributors
## Translators
## Designers]]></credits>

</modDesc>

ZielStruktur:
XML:
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<modDesc descVersion="47">
    <version>1.01.00001</version>
    <author><![CDATA[devTeam]]></author>
    <title>
        <en>bla</en>
        <de>bla</de>
    </title>
    <multiplayer supported="true" />
    <iconFilename>img/store.dds</iconFilename>
    <l10n filenamePrefix="translations/translation" />
    <extraSourceFiles>
        <sourceFile filename="register.lua" />
    </extraSourceFiles>

    <actions>
        <action name="bla" axisType="HALF"  />
        <action name="bla" axisType="HALF"  />
        <action name="bla" axisType="HALF"  />
    </actions>

    <inputBinding>
        <actionBinding action="bla">
            <binding device="bla" input="" />
        </actionBinding>
    </inputBinding>
    <credits><![CDATA[
## Contributors
## Translators
## Designers]]></credits>

</modDesc>
 

Dalek

Lt. Junior Grade
Dabei seit
Jan. 2008
Beiträge
313
Probier die mal mit einem anderen Encoding einzulesen, auch wenn da UTF-8 steht. Das könnte das Problem mit den Sonderzeichen beheben, wenn das z.B. eine ISO-8859-1 Datei ist obwohl da UTF-8 drin steht.
 

PHuV

Vice Admiral
Dabei seit
März 2005
Beiträge
6.779
Ich habe sehr viele verschiedene XML Dateien, die ich nicht mit einem xml Parser auslesen kann, da Sonderzeichen benutzt werden, die beim einlesen zu Fehlern führen.
Darf so nicht sein. Dann ändere das Encoding im Header. Weißt Du genau, wer diese Datei erstellt hat? Dann gleich mal anmahnen, wenn der nicht korrekt erstellt wurde. Und es kann sein, daß manche Parser eine BOM verwenden bzw. verlangen.
Ergänzung ()

Probier die mal mit einem anderen Encoding einzulesen, auch wenn da UTF-8 steht. Das könnte das Problem mit den Sonderzeichen beheben, wenn das z.B. eine ISO-8859-1 Datei ist obwohl da UTF-8 drin steht.
Und was machst Du dann, wenn weiter UTF-8 Zeichen auftauchen?

Ich finde es echt traurig, daß kaum einer mal richtig die W3C Vorgaben liest und den Header bis heute richtig setzt. Und so was nennt sich Standard. In meinen Augen ist XML das vermurksteste Format überhaupt, was Anfangs so viele Probleme bis heute machte, weil so viele es "anders" interpretierten als gedacht.
 
Zuletzt bearbeitet:

Dalek

Lt. Junior Grade
Dabei seit
Jan. 2008
Beiträge
313
Und was machst Du dann, wenn weiter UTF-8 Zeichen auftauchen?
Meine Variante hilft nur wenn das Encoding in der ganzen Datei falsch ist, was aber schon eine der wahrscheinlicheren Varianten ist, und eine die ich schon in freier Wildbahn gesehen habe. Oder der Fragesteller hat die Datei aus Versehen nicht als UTF-8 eingelesen, was aufs gleiche rauskommt.
 

schrotti12

Lt. Junior Grade
Dabei seit
Juli 2004
Beiträge
332
Hallo,

bei Java verwende ich meist Pattern und Matcher zum Ersetzten. Suchen tu ich zeilenweise:

Java:
Pattern v1 = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)");
Matcher m1 = v1.matcher(inputString);
String goal = String.format("%s.%s.%s", m1.group(1), m1.group(2), m1.group(3));

group(n); referenziert auf "(\\d)" und gibt das n-te Element zurück. Ich verwende das zum Parsen von Versionsnummern. Hofe, dass das was hilft.

Ob eine Zeile überhaupt passt, kannst du mit folgendem Code testen:
Java:
if (m1.matches()) {
    ....
}
 

BeBur

Commander
Dabei seit
Nov. 2018
Beiträge
2.337
Gute Antworten hast du ja schon bekommen. Ich will aber dennoch auch noch deine eigentliche Frage beantworten, falls dir der eigentlich korrekte Weg nicht weiter hilft.

Jedenfalls, beim Schreiben des regex zur Frage hab ich grad gelernt, dass capturing groups schwerlich zusammen mit Negationen funktionieren, was mir in dem Ausmaß nicht so ganz klar war :o. Bevor man jetzt übermäßig komplizierte Regex mit look ahead baut würde ich daher einfach von <title> bis </title> die Zeilen iterieren und z.B. schlicht checken, ob diese <en> oder <de> beinhaltet -> das geht sicherlich ohne die regex engine zu verwenden.
 

Mystery1988

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
März 2015
Beiträge
121
Probier die mal mit einem anderen Encoding einzulesen, auch wenn da UTF-8 steht. Das könnte das Problem mit den Sonderzeichen beheben, wenn das z.B. eine ISO-8859-1 Datei ist obwohl da UTF-8 drin steht.
Also die xml Dateien sind in Mods für ein Spiel enthalten und die Modder, kennen sich nicht mit Encoding oder irgendwelchen Standards aus =/
Die meisten xml Dateien sind UTF-8 mit BOM. Aktuell lasse ich den inputstream selber entscheiden was er läd. Wenn ich UTF-8 vorgebe, funktionieren viele nicht.

Es wird auch das & Zeichen in irgendwelchen Namen/Inhalten benutzt oder in der xml-version wird die Mod version hinterlegt :(

@BeBur Das wäre auch eine Idee die man machen könnte.

@schrotti12 dein Lösungsvorschlag schaue ich mir auch mal an.

Das beste ist ja, wenn ich mein Java Programm aus der IDE herausstarte, funktioniert viel mehr, als in der kompilierten exe^^
Meine Tester meinten ähh der zeigt mir aber nicht viel an, ich meinte nur, bei mir wird mehr angezeigt. Eine Sache die ich auch noch nicht ganz verstehe
 

andy_m4

Captain
Dabei seit
Aug. 2015
Beiträge
3.784
Ich habe sehr viele verschiedene XML Dateien, die ich nicht mit einem xml Parser auslesen kann, da Sonderzeichen benutzt werden, die beim einlesen zu Fehlern führen.
Dann nimm einen anderen Parser oder konfiguriere ihn ordentlich.
Mit RegExps direkt auf XML herum zu hantieren ist - gelinde gesagt - suboptimal.

Wenn BOM nicht funktioniert kann man auch einfach mal testweise den Content dekodieren und wenn dabei ein Zeichen rauskommt, was definitiv nicht zum Zeichenvorrat gehört dann weißt Du, das Du den falschen Decoder erwischt hat. Probiert man halt nach einander die üblichen Verdächtigen wie UTF-8, ISO-8859 usw. durch.
Ist zwar keine elegante Lösung. Bessere wäre es, wenn Dich die Quelldaten nicht belügen würden. Ist aber eine pragmatische Lösung.
 
Top