private void appendAttribute(StringBuilder sb, String name, String value) {
   sb.append(" ");
   sb.append(name);
   sb.append("=\"");
   sb.append(XMLUtil.escapeDoubleQuotedAttValue(value));
   sb.append("\"");
 }
  public void characters(char[] ch, int start, int length) throws SAXException {
    try {
      if (inRDFContext) {
        // verify if we need to switch to XMLLiteral processing mode immediately.
        if (deferredElement != null && !parseLiteralMode) {
          Att parseType = deferredElement.atts.getAtt(RDF.NAMESPACE, "parseType");
          if (parseType != null && parseType.getValue().equals("Literal")) {
            setParseLiteralMode();
          }
        }

        if (parseLiteralMode) {
          if (deferredElement != null) {
            reportDeferredStartElement();
          }

          // Characters like '<', '>', and '&' must be escaped to
          // prevent breaking the XML text.
          String s = new String(ch, start, length);
          s = XMLUtil.escapeCharacterData(s);
          charBuf.append(s);
        } else {
          charBuf.append(ch, start, length);

          // if the element is not empty we need to process it as such. Otherwise,
          // we keep the start element deferred for now.
          if (deferredElement != null && charBuf.toString().trim().length() > 0) {
            reportDeferredStartElement();
          }
        }
      }
    } catch (RDFParseException e) {
      throw new SAXException(e);
    } catch (RDFHandlerException e) {
      throw new SAXException(e);
    }
  }