Necesito unescape una cadena xml que contiene escapó de las etiquetas XML:

<
>
&
etc...

Me hizo encontrar algunas libs que pueden realizar esta tarea, pero yo prefiero usar un único método que puede realizar esta tarea.

Alguien puede ayudarme?

saludos,
Bas Hendriks

InformationsquelleAutor Bas Hendriks | 2010-05-14

4 Comentarios

  1. 46
    StringEscapeUtils.unescapeXml(xml)

    (commons-lang, descargar)

    • «pero yo prefiero usar un único método que puede realizar esta tarea.»
    • Que es un método único.
    • Bas, leer commons-lang, código fuente y ver si vale la pena reinventar la rueda en su caso en lugar de justing utilizando.
    • no hay nada en el estándar de Java para hacer esto, así que o usas una librería de terceros que puede hacer esto para usted, o usted tiene que escribir por ti mismo (no se recomienda).
    • commons-lang parece obsoleto, y commons-el texto debe ser utilizado. commons.apache.org/proper/commons-text mvnrepository.com/artifact/org.apache.commons/commons-text/1.6
  2. 6

    He aquí un método sencillo para unescape XML. Se encarga de la predefinidos entidades XML y numérico decimal entidades (&#nnnn;). La modificación de manejar hex entidades (&#xhhhh;) debe 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;
    }
  3. 4

    Aquí es uno que escribí en diez minutos. No usar expresiones regulares, sólo simple iteraciones. No creo que este puede 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();
    }
    • Este doen el apoyo de entidades numéricas

Dejar respuesta

Please enter your comment!
Please enter your name here