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("&", i)) {
result.append(''&'');
i += 5;
} else if (text.startsWith("'", i)) {
result.append(''/''');
i += 6;
} else if (text.startsWith(""", i)) {
result.append(''"'');
i += 6;
} else if (text.startsWith("<", i)) {
result.append(''<'');
i += 4;
} else if (text.startsWith(">", i)) {
result.append(''>'');
i += 4;
} else i++;
}
}
return result.toString();
}
Si trabaja con JSP, use su: openutils-elfunctions de openutils-elfunctions
StringEscapeUtils.unescapeXml(xml)
( commons-lang , download )