special online escape convert characters java xml escaping

java - online - xml formatter



cómo unescape XML en java (4)

Necesito borrar una cadena xml que contiene etiquetas XML escapadas:

< > & etc...

Encontré algunas bibliotecas que pueden realizar esta tarea, pero preferiría usar un solo método que pueda realizar esta tarea.

¿Alguien puede ayudar?

Saludos, Bas Hendriks


Aquí hay un método simple para unescape XML. Maneja las entidades XML predefinidas y las entidades numéricas decimales (& # nnnn;). Modificarlo para manejar entidades hexadecimales (& # xhhhh;) debería ser simple.

public static String unescapeXML( final String xml ) { Pattern xmlEntityRegex = Pattern.compile( "&(#?)([^;]+);" ); //Unfortunately, Matcher requires a StringBuffer instead of a StringBuilder StringBuffer unescapedOutput = new StringBuffer( xml.length() ); Matcher m = xmlEntityRegex.matcher( xml ); Map<String,String> builtinEntities = null; String entity; String hashmark; String ent; int code; while ( m.find() ) { ent = m.group(2); hashmark = m.group(1); if ( (hashmark != null) && (hashmark.length() > 0) ) { code = Integer.parseInt( ent ); entity = Character.toString( (char) code ); } else { //must be a non-numerical entity if ( builtinEntities == null ) { builtinEntities = buildBuiltinXMLEntityMap(); } entity = builtinEntities.get( ent ); if ( entity == null ) { //not a known entity - ignore it entity = "&" + ent + '';''; } } m.appendReplacement( unescapedOutput, entity ); } m.appendTail( unescapedOutput ); return unescapedOutput.toString(); } private static Map<String,String> buildBuiltinXMLEntityMap() { Map<String,String> entities = new HashMap<String,String>(10); entities.put( "lt", "<" ); entities.put( "gt", ">" ); entities.put( "amp", "&" ); entities.put( "apos", "''" ); entities.put( "quot", "/"" ); return entities; }


Aquí hay uno que escribí en diez minutos. No utiliza expresiones regulares, solo iteraciones simples. No creo que esto pueda ser mejorado para ser mucho más rápido.

public static String unescape(final String text) { StringBuilder result = new StringBuilder(text.length()); int i = 0; int n = text.length(); while (i < n) { char charAt = text.charAt(i); if (charAt != ''&'') { result.append(charAt); i++; } else { if (text.startsWith("&amp;", i)) { result.append(''&''); i += 5; } else if (text.startsWith("&apos;", i)) { result.append(''/'''); i += 6; } else if (text.startsWith("&quot;", i)) { result.append(''"''); i += 6; } else if (text.startsWith("&lt;", i)) { result.append(''<''); i += 4; } else if (text.startsWith("&gt;", i)) { result.append(''>''); i += 4; } else i++; } } return result.toString(); }