Saturday 30 July 2011

Replaces all XML character entities with the character they represent.

  
/*
 * Copyright Aduna (http://www.aduna-software.com/) (c) 1997-2006.
 *
 * Licensed under the Aduna BSD-style license.
 */
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class Utils {
  /**
   * Replaces all XML character entities with the character they represent.
   */
  public static String resolveEntities(String text) {
    int ampIndex = text.indexOf('&');
    
    if (ampIndex == -1) {
      // Text doesn't contain any entities
      return text;
    }
    
    StringBuilder sb = new StringBuilder((int)(1.1 * text.length()));
    int prevIndex = 0;

    while (ampIndex >= 0) {
      int colonIndex = text.indexOf(';', ampIndex);

      sb.append(text.substring(prevIndex, ampIndex));
      sb.append(
        resolveEntitytext.substring(ampIndex + 1, colonIndex) )
      );

      prevIndex = colonIndex + 1;
      ampIndex = text.indexOf('&', prevIndex);
    }

    sb.append(text.substring(prevIndex));

    return sb.toString();
  }
  /**
   * Resolves an entity reference or character reference to its value. 
   *
   @param entName The 'name' of the reference. This is the string between
   * & and ;, e.g. amp, quot, #65 or #x41.
   @return The value of the supplied reference, or the reference itself
   * if it could not be resolved.
   */
  public static String resolveEntity(String entName) {
    if (entName.startsWith("#")) {
      // character reference
      StringBuilder sb = new StringBuilder();
      if (entName.charAt(1== 'x') {
        // Hex-notation
        sb.append((char)Integer.parseInt(entName.substring(2)16));
      }
      else {
        // Dec-notation
        sb.append((char)Integer.parseInt(entName.substring(1)));
      }
      return sb.toString();
    }
    else if (entName.equals("apos")) {
      return "'";
    }
    else if (entName.equals("quot")) {
      return "\"";
    }
    else if (entName.equals("gt")) {
      return ">";
    }
    else if (entName.equals("lt")) {
      return "<";
    }
    else if (entName.equals("amp")) {
      return "&";
    }
    else {
      return entName;
    }
  }
}

   
    
  

No comments:

Post a Comment