tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
1145
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    dlk94mylis Tutorials.de Gastzugang
    Hi,

    Ich muss aus einem String, welcher pseudo-xml enthält, ein vernünftiges xml-doc bauen. Tollerweise enthält der String allemöglichen Sonderzeichen: öäü ' ß & _ etc.pp...
    Die muss ich nun in xml-valide ketten ersetzen, zb. alle ü in ü.

    Das würde zu folgendem führen:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
                    result = result.replace("ü", "ü");
                    result = result.replace("Ü", "&#220");
                    result = result.replace("ä", "&#228");
                    result = result.replace("Ä", "&#196");
                    result = result.replace("ö", "&#246");
                    result = result.replace("Ö", "&#214");
                    result = result.replace("ß", "&#223");
                    
                    result = result.replace("ü", "ü");
                    result = result.replace("Ü", "&#220");
                    result = result.replace("ä", "&#228");
                    result = result.replace("Ä", "&#196");
                    result = result.replace("ö;", "&#246");
                    result = result.replace("ö", "&#214");
                    result = result.replace("ß", "&#223");
     
                    result = result.replace("'", "&apos");
                    result = result.replace("&", "&");
                    result = result.replace("\"", """);

    Kann man das irgendwie performanter machen? schließlich geht er so den kompletten String n mal durch....zwar immer noch linear, aber dennoch nich doll, oder?

    Thnx!
     

  2. #2
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Wieso benutzt Du nicht einen vernünftigen DOM-Parser. Damit hast Du das Problem gar nicht, weil der Parser das für Dich löst. JDom sollte das können :

    http://www.galileocomputing.de/openb...ace6f924e5b094

    Wenn das nicht für Dich in Frage kommt, solltest Du das mit regulären Ausdrücken lösen. Mittlerweile gibt es ja auch in Java eine RegEx-Engine.

    Grüße

    Jo

    P.S. Noch ein bischen Code dazu:



    package de.limago;

    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.output.XMLOutputter;


    public class DomDemo {


    public static void main(String[] args) throws Exception {

    Document doc = new Document();

    Element element = new Element("root");
    doc.addContent(element);

    element.addContent("& \" < > etc.");

    XMLOutputter out = new XMLOutputter();
    out.output( doc, System.out );

    }


    }

    macht folgende Ausgabe:

    <?xml version="1.0" encoding="UTF-8"?>
    <root>&amp; " &lt; &gt; etc.</root>
    Geändert von limago (07.05.07 um 19:37 Uhr)
     

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    flotter würde es gehen, wenn du das ganze in einen StringBuilder steckst... implizit werden bei String.replace immer komplett neue String Instanzen erzeugt...
    http://www.tutorials.de/forum/java/2...umwandeln.html

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  4. #4
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Hi,

    ich wollte es genau wissen und habe die Performance gemessen. Der Stringbuilder ist 4 mal schneller als RegEx und 5 mal schneller als die Stringlösung. Ich bin beeindruckt...

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    
     
    import java.util.HashMap;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    public class Tester {
     
        static Map<String, String> characterToEntityMap = new HashMap<String, String>();
        static Map<Pattern, String> patternMap = new HashMap<Pattern, String>();
        
        static {
            
            characterToEntityMap.put("ü", "ü");
            characterToEntityMap.put("Ü", "Ü");
            characterToEntityMap.put("ä", "ä");
            characterToEntityMap.put("Ä", "Ä");
            characterToEntityMap.put("ö;", "ö");
            characterToEntityMap.put("ö", "Ö");
            characterToEntityMap.put("ß", "ß");
     
            characterToEntityMap.put("'", "&apos;");
            characterToEntityMap.put("&", "&amp;");
            characterToEntityMap.put("\"", "&quot;");
     
            patternMap.put(Pattern.compile("ü"), "ü");
            patternMap.put(Pattern.compile("Ü"), "Ü");
            patternMap.put(Pattern.compile("ä"), "ä");
            patternMap.put(Pattern.compile("Ä"), "Ä");
            patternMap.put(Pattern.compile("ö;"), "ö");
            patternMap.put(Pattern.compile("ö"), "Ö");
            patternMap.put(Pattern.compile("ß"), "ß");
     
            patternMap.put(Pattern.compile("'"), "&apos;");
            patternMap.put(Pattern.compile("&"), "&amp;");
            patternMap.put(Pattern.compile("\""), "&quot;");
     
        }
        
        public static void main(String[] args) {
     
            for (int i = 0; i < 20; i++) {
     
                long start = System.currentTimeMillis();
                for (int j = 0; j < 10000; j++) {
                    String result;
     
                    result = "üäÄÖüäÄÖüäÄÖüäÄÖüäÄÖüäÄÖüäÄÖüäÄÖ";
     
                    result = result.replace("ü", "ü");
                    result = result.replace("Ü", "Ü");
                    result = result.replace("ä", "ä");
                    result = result.replace("Ä", "Ä");
                    result = result.replace("ö;", "ö");
                    result = result.replace("ö", "Ö");
                    result = result.replace("ß", "ß");
     
                    result = result.replace("'", "&apos;");
                    result = result.replace("&", "&amp;");
                    result = result.replace("\"", "&quot;");
     
                }
                long end = System.currentTimeMillis();
                System.out.println("Replace mit String:" + (end - start)
                        + " millis");
            }
     
            for (int i = 0; i < 20; i++) {
                
                long start = System.currentTimeMillis();
                for (int j = 0; j < 10000; j++) {
                    String result=null;
     
                    result = "üäÄÖüäÄÖüäÄÖüäÄÖüäÄÖüäÄÖüäÄÖüäÄÖ";
                    result = escapeHtmlSpecialChars(result);
                }
                long end = System.currentTimeMillis();
                
                System.out.println("Replace mit Stringbuilder:" + (end - start)
                        + " millis");
            }
            
            for (int i = 0; i < 20; i++) {
                StringBuffer result=null;
                long start = System.currentTimeMillis();
                for (int j = 0; j < 10000; j++) {
                    
     
                    result = new StringBuffer("üäÄÖüäÄÖüäÄÖüäÄÖüäÄÖüäÄÖüäÄÖüäÄÖ");
                    for(Pattern p : patternMap.keySet()) {
                        Matcher m = p.matcher(result);
                         StringBuffer sb = new StringBuffer();
                         while (m.find()) {
                             m.appendReplacement(sb, patternMap.get(p));
                         }
                         m.appendTail(sb);
                         result = sb;
                    }
                     
                }
                long end = System.currentTimeMillis();
                System.out.println("Replace mit RegEx:" + (end - start)
                        + " millis");
            }
     
        }
        
        
     
        public static String escapeHtmlSpecialChars(String htmlString) {
            StringBuilder stringBuilder = new StringBuilder();
            for (char c : htmlString.toCharArray()) {
                String characterString = String.valueOf(c);
                if (isHtmlSpecialCharacter(c)) {
                    //stringBuilder.append("&");
                    stringBuilder.append(characterToEntityMap
                            .get(characterString));
                    //stringBuilder.append(";");
                } else {
                    stringBuilder.append(c);
                }
            }
            return stringBuilder.toString();
        }
     
        private static boolean isHtmlSpecialCharacter(char c) {
            return characterToEntityMap.containsKey(String.valueOf(c))
                    || c < ' ';
        }
    }
     

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 22.11.10, 17:31
  2. [Batch] String replacement / DIR Funktion ändern
    Von Blacker im Forum Sonstige Sprachen
    Antworten: 1
    Letzter Beitrag: 29.09.08, 19:27
  3. Syntax error converting datetime from character string
    Von daschii im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 13.02.06, 10:20
  4. Antworten: 4
    Letzter Beitrag: 26.01.06, 09:59
  5. Antworten: 3
    Letzter Beitrag: 30.10.04, 20:31