ERLEDIGT
NEIN
NEIN
ANTWORTEN
3
3
ZUGRIFFE
1145
1145
EMPFEHLEN
-
07.05.07 17:09 #1dlk94mylis 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("Ü", "Ü"); result = result.replace("ä", "ä"); result = result.replace("Ä", "Ä"); result = result.replace("ö", "ö"); result = result.replace("Ö", "Ö"); result = result.replace("ß", "ß"); 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("&", "&"); 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!
-
07.05.07 19:28 #2
- 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>& " < > etc.</root>Geändert von limago (07.05.07 um 19:37 Uhr)
-
07.05.07 20:39 #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ß TomJava 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
-
08.05.07 09:36 #4
- 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("'", "'"); characterToEntityMap.put("&", "&"); characterToEntityMap.put("\"", """); 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("'"), "'"); patternMap.put(Pattern.compile("&"), "&"); patternMap.put(Pattern.compile("\""), """); } 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("'", "'"); result = result.replace("&", "&"); result = result.replace("\"", """); } 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
-
public String replaceAll(String regex, String replacement) und das $-Zeichen
Von takidoso im Forum JavaAntworten: 5Letzter Beitrag: 22.11.10, 17:31 -
[Batch] String replacement / DIR Funktion ändern
Von Blacker im Forum Sonstige SprachenAntworten: 1Letzter Beitrag: 29.09.08, 19:27 -
Syntax error converting datetime from character string
Von daschii im Forum Relationale DatenbanksystemeAntworten: 0Letzter Beitrag: 13.02.06, 10:20 -
von einem Character etwas dazuzählen und neuen Buchstaben bekommen
Von takidoso im Forum JavaAntworten: 4Letzter Beitrag: 26.01.06, 09:59 -
String aus einem String filtern (mit Anfangs- und Endstring)
Von icy_killer im Forum PHPAntworten: 3Letzter Beitrag: 30.10.04, 20:31





Zitieren

Login





