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(
resolveEntity( text.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;
}
}
}
Related examples in the same category