Writing nested CDATA in XML and reuse of DocumentBuilder

XmlHelper Class:
package com.jaspersoft.jasperserver.ws.xml;

import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

public class XmlHelper {
 
 private static final ThreadLocal docBuilder = new ThreadLocal() {
        @Override protected DocumentBuilder initialValue() {
            
         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
         DocumentBuilder builder = null;
         
        try {
           builder = factory.newDocumentBuilder();
        } 
        catch (ParserConfigurationException e) {
           throw new RuntimeException(e);
        }
         
         return builder;
        }
 };
 
 private static final ThreadLocal transformer = new ThreadLocal() {
        @Override protected Transformer initialValue() {
            
         TransformerFactory factory =       TransformerFactory.newInstance("com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl",  Thread.currentThread().getContextClassLoader());
         Transformer trans = null;  

   try {
        trans = factory.newTransformer();
   } 
    catch (TransformerConfigurationException e) {
           throw new RuntimeException(e);
    }
     return trans;
    }
 }; 
 
 public static String getXMLFromDocument(Document document)   {  
     Transformer transformer = XmlHelper.getTransformer();
     transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
     StreamResult streamResult = new StreamResult(new StringWriter());  
     DOMSource source = new DOMSource(document);  
     
     try {
       transformer.transform(source, streamResult);
     } 
     catch (TransformerException e) {
          e.printStackTrace();
          return "";
      } 
     
     XmlHelper.resetTransformer();
     
     return streamResult.getWriter().toString();  
 }  
 
 public static DocumentBuilder getDocumentBuilder(){
  return XmlHelper.docBuilder.get();
 }
 
 public static void resetDocumentBuilder(){
  getDocumentBuilder().reset();
 }
 
 public static Transformer getTransformer(){
  return XmlHelper.transformer.get();
 }
 
 public static void resetTransformer(){
  getTransformer().reset();
 }
 
}
Caller class:
        Document document = XmlHelper.getDocumentBuilder().newDocument();
        Element rootElement = document.createElement("value");
        rootElement.appendChild(document.createCDATASection(value));
       document.appendChild(rootElement);
    
       String xmlString = XmlHelper.getXMLFromDocument(document);
       xml.append(currentIndentation + xmlString + "\n");
       XmlHelper.resetDocumentBuilder();

留言

這個網誌中的熱門文章

Disable ionic's sidemenu content drag to toggle menu

Multiple writable mappings exist for the field. Only one may be defined as writable, all others must be specified read-only.

java.lang.NoClassDefFoundError: org/apache/xerces/jaxp/datatype/XMLGregorianCalendarImpl$Parser