An encoder for converting text to be used within XML attribute values : DOM Attribute « XML « Java Tutorial






import java.text.CharacterIterator;
import java.text.StringCharacterIterator;
import java.util.HashMap;
import java.util.Map;

/**
 * An encoder useful for converting text to be used within XML attribute values.
 * The following translations will be performed:
 * <table cellspacing="0" cellpadding="1" border="1">
 * <tr>
 * <th>Raw (Unencoded)<br/>Character</th>
 * <th>Translated (Encoded)<br/>Entity</th>
 * </tr>
 * <tr>
 * <td> &amp; </td>
 * <td> &amp;amp; </td>
 * </tr>
 * <tr>
 * <td> &lt; </td>
 * <td> &amp;lt; </td>
 * </tr>
 * <tr>
 * <td> &gt; </td>
 * <td> &amp;gt; </td>
 * </tr>
 * <tr>
 * <td> &quot; </td>
 * <td> &amp;quot; </td>
 * </tr>
 * <tr>
 * <td> &#039; </td>
 * <td> &amp;#039; </td>
 * </tr>
 * <tr>
 * <td>All Others</td>
 * <td>No Translation</td>
 * </tr>
 * </table>
 * </p>
 */
public class XmlValueEncoder  {
    
    private static final Map<String, Character> SPECIAL_ENTITIES;
    
    static {
        SPECIAL_ENTITIES = new HashMap<String, Character>();
        
        SPECIAL_ENTITIES.put("quot", '"');
        SPECIAL_ENTITIES.put("gt", '>');
        SPECIAL_ENTITIES.put("lt", '<');
        SPECIAL_ENTITIES.put("amp", '&');
        
    }
    
    /**
     * {@inheritDoc}
     *
     * @see org.jboss.dna.common.text.TextEncoder#encode(java.lang.String)
     */
    public String encode( String text ) {
        if (text == null) return null;
        StringBuilder sb = new StringBuilder();
        CharacterIterator iter = new StringCharacterIterator(text);
        for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
            switch (c) {
                case '&':
                    sb.append("&amp;");
                    break;
                case '"':
                    sb.append("&quot;");
                    break;
                case '<':
                    sb.append("&lt;");
                    break;
                case '>':
                    sb.append("&gt;");
                    break;
                case '\'':
                    sb.append("&#039;");
                    break;
                default:
                    sb.append(c);
            }
        }
        return sb.toString();
    }

    /**
     * {@inheritDoc}
     *
     * @see org.jboss.dna.common.text.TextDecoder#decode(java.lang.String)
     */
    public String decode( String encodedText ) {
        if (encodedText == null) return null;
        StringBuilder sb = new StringBuilder();
        CharacterIterator iter = new StringCharacterIterator(encodedText);
        for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
            if (c == '&') {
                int index = iter.getIndex();
                
                do {
                    c = iter.next();
                }
                while (c != CharacterIterator.DONE && c != ';');

                // We found a closing semicolon
                if (c == ';') {
                    String s = encodedText.substring(index + 1, iter.getIndex());
                    
                    if (SPECIAL_ENTITIES.containsKey(s)) {
                        sb.append(SPECIAL_ENTITIES.get(s));
                        continue;
                        
                    }
                    
                    if (s.length() > 0 && s.charAt(0) == '#') {
                        try {
                            sb.append((char) Short.parseShort(s.substring(1, s.length())));
                            continue;
                        }
                        catch (NumberFormatException nfe) {
                            // This is possible in malformed encodings, but let it fall through
                        }
                    }
                }
                
                // Malformed encoding, restore state and pass poorly encoded data back
                c = '&';
                iter.setIndex(index);                            
            }

            sb.append(c);

        }
        return sb.toString();
    }
}








33.5.DOM Attribute
33.5.1.Set Attribute
33.5.2.Get Attribute
33.5.3.Get an Attribute from an Element. Returns an empty String if none found
33.5.4.Has Attribute
33.5.5.Output XML element Attributes
33.5.6.Find Element Or Create And Attribute
33.5.7.Find Element Or Create And Set Attribute
33.5.8.Returns the value of the attribute of the given element
33.5.9.Set an Attribute in an Element
33.5.10.Return a list of named Elements with a specific attribute value.
33.5.11.Encode Xml Attribute
33.5.12.Copy the attribues on one element to the other
33.5.13.An encoder for converting text to be used within XML attribute values
33.5.14.remove Attribute
33.5.15.return the right attribute node
33.5.16.return the value of the attribute of the given element with the given name
33.5.17.get all the attributes for an Element