Mega Code Archive

 
Categories / Java / XML
 

XML input, output and transform utilities

import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Writer; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.StringTokenizer; import java.util.WeakHashMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Source; 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.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Attr; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.Text; import org.w3c.dom.bootstrap.DOMImplementationRegistry; import org.w3c.dom.ls.DOMImplementationLS; import org.w3c.dom.ls.LSOutput; import org.w3c.dom.ls.LSSerializer; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public final class XMLUtils {     private static final Map<ClassLoader, DocumentBuilderFactory> DOCUMENT_BUILDER_FACTORIES         = Collections.synchronizedMap(new WeakHashMap<ClassLoader, DocumentBuilderFactory>());          private static final Map<ClassLoader, TransformerFactory> TRANSFORMER_FACTORIES         = Collections.synchronizedMap(new WeakHashMap<ClassLoader, TransformerFactory>());     private XMLUtils() {     }     private static TransformerFactory getTransformerFactory() {         ClassLoader loader = Thread.currentThread().getContextClassLoader();         if (loader == null) {             loader = XMLUtils.class.getClassLoader();         }         if (loader == null) {             return TransformerFactory.newInstance();         }         TransformerFactory factory = TRANSFORMER_FACTORIES.get(loader);         if (factory == null) {             factory = TransformerFactory.newInstance();             TRANSFORMER_FACTORIES.put(loader, factory);         }         return factory;     }     private static DocumentBuilderFactory getDocumentBuilderFactory() {         ClassLoader loader = Thread.currentThread().getContextClassLoader();         if (loader == null) {             loader = XMLUtils.class.getClassLoader();         }         if (loader == null) {             return DocumentBuilderFactory.newInstance();         }         DocumentBuilderFactory factory = DOCUMENT_BUILDER_FACTORIES.get(loader);         if (factory == null) {             factory = DocumentBuilderFactory.newInstance();             factory.setNamespaceAware(true);             DOCUMENT_BUILDER_FACTORIES.put(loader, factory);         }         return factory;     }     public static Transformer newTransformer() throws TransformerConfigurationException {         return getTransformerFactory().newTransformer();     }     public static DocumentBuilder getParser() throws ParserConfigurationException {         return getDocumentBuilderFactory().newDocumentBuilder();     }     public static Document parse(InputSource is) throws ParserConfigurationException, SAXException,         IOException {         return getParser().parse(is.getSystemId());     }     public static Document parse(File is) throws ParserConfigurationException, SAXException,         IOException {         return getParser().parse(is);     }     public static Document parse(InputStream in) throws ParserConfigurationException, SAXException,         IOException {           return getParser().parse(in);     }     public static Document parse(String in) throws ParserConfigurationException, SAXException, IOException {         return parse(in.getBytes());     }     public static Document parse(byte[] in) throws ParserConfigurationException, SAXException, IOException {           return getParser().parse(new ByteArrayInputStream(in));     }     public static Document newDocument() throws ParserConfigurationException {         return getParser().newDocument();     }     public static void writeTo(Node node, OutputStream os) {         writeTo(new DOMSource(node), os);     }     public static void writeTo(Node node, OutputStream os, int indent) {         writeTo(new DOMSource(node), os, indent);     }     public static void writeTo(Source src, OutputStream os) {         writeTo(src, os, -1);     }     public static void writeTo(Source src, OutputStream os, int indent) {         String enc = null;         if (src instanceof DOMSource             && ((DOMSource)src).getNode() instanceof Document) {             enc = ((Document)((DOMSource)src).getNode()).getXmlEncoding();         }         writeTo(src, os, indent, enc, "no");     }     public static void writeTo(Source src,                                OutputStream os,                                int indent,                                String charset,                                String omitXmlDecl) {         Transformer it;         try {                          //charset = "utf-8";                           it = newTransformer();             it.setOutputProperty(OutputKeys.METHOD, "xml");             if (indent > -1) {                 it.setOutputProperty(OutputKeys.INDENT, "yes");                 it.setOutputProperty("{http://xml.apache.org/xslt}indent-amount",                                      Integer.toString(indent));             }             it.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, omitXmlDecl);             it.setOutputProperty(OutputKeys.ENCODING, charset);             it.transform(src, new StreamResult(os));         } catch (TransformerException e) {             throw new RuntimeException("Failed to configure TRaX", e);         }     }     public static String toString(Source source) throws TransformerException, IOException {         return toString(source, null);     }     public static String toString(Source source, Properties props) throws TransformerException, IOException {         ByteArrayOutputStream bos = new ByteArrayOutputStream();         StreamResult sr = new StreamResult(bos);         Transformer trans = newTransformer();         if (props == null) {             props = new Properties();             props.put(OutputKeys.OMIT_XML_DECLARATION, "yes");         }         trans.setOutputProperties(props);         trans.transform(source, sr);         bos.close();         return bos.toString();     }     public static String toString(Node node, int indent) {         ByteArrayOutputStream out = new ByteArrayOutputStream();         writeTo(node, out, indent);         return out.toString();     }     public static String toString(Node node) {         ByteArrayOutputStream out = new ByteArrayOutputStream();         writeTo(node, out);         return out.toString();     }     public static void printDOM(Node node) {         printDOM("", node);     }     public static void printDOM(String words, Node node) {         System.out.println(words);         System.out.println(toString(node));     }     public static Attr getAttribute(Element el, String attrName) {         return el.getAttributeNode(attrName);     }     public static void replaceAttribute(Element element, String attr, String value) {         if (element.hasAttribute(attr)) {             element.removeAttribute(attr);         }         element.setAttribute(attr, value);     }     public static QName getNamespace(Map<String, String> namespaces, String str, String defaultNamespace) {         String prefix = null;         String localName = null;         StringTokenizer tokenizer = new StringTokenizer(str, ":");         if (tokenizer.countTokens() == 2) {             prefix = tokenizer.nextToken();             localName = tokenizer.nextToken();         } else if (tokenizer.countTokens() == 1) {             localName = tokenizer.nextToken();         }         String namespceURI = defaultNamespace;         if (prefix != null) {             namespceURI = (String)namespaces.get(prefix);         }         return new QName(namespceURI, localName);     }     public static Element createElementNS(Node node, QName name) {         return createElementNS(node.getOwnerDocument(), name.getNamespaceURI(), name.getLocalPart());     }     public static Element createElementNS(Document root, QName name) {         return createElementNS(root, name.getNamespaceURI(), name.getLocalPart());     }     public static Element createElementNS(Document root, String namespaceURI, String qualifiedName) {         return root.createElementNS(namespaceURI, qualifiedName);     }     public static Text createTextNode(Document root, String data) {         return root.createTextNode(data);     }     public static Text createTextNode(Node node, String data) {         return createTextNode(node.getOwnerDocument(), data);     }     public static void removeContents(Node parent) {              Node node = parent.getFirstChild();         while (node != null) {             parent.removeChild(node);             node = node.getNextSibling();         }     }     public static InputStream getInputStream(Document doc) throws Exception {         DOMImplementationLS impl = null;         DOMImplementation docImpl = doc.getImplementation();         // Try to get the DOMImplementation from doc first before         // defaulting to the sun implementation.         if (docImpl != null && docImpl.hasFeature("LS", "3.0")) {             impl = (DOMImplementationLS)docImpl.getFeature("LS", "3.0");         } else {             DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();             impl = (DOMImplementationLS)registry.getDOMImplementation("LS");             if (impl == null) {                 System.setProperty(DOMImplementationRegistry.PROPERTY,                                    "com.sun.org.apache.xerces.internal.dom.DOMImplementationSourceImpl");                 registry = DOMImplementationRegistry.newInstance();                 impl = (DOMImplementationLS)registry.getDOMImplementation("LS");             }         }         LSOutput output = impl.createLSOutput();         ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();         output.setByteStream(byteArrayOutputStream);         LSSerializer writer = impl.createLSSerializer();         writer.write(doc, output);         byte[] buf = byteArrayOutputStream.toByteArray();         return new ByteArrayInputStream(buf);     }     public static QName getQName(String value, Node node) {         if (value == null) {             return null;         }         int index = value.indexOf(":");         if (index == -1) {             return new QName(value);         }         String prefix = value.substring(0, index);         String localName = value.substring(index + 1);         String ns = node.lookupNamespaceURI(prefix);         if (ns == null || localName == null) {             throw new RuntimeException("Invalid QName in mapping: " + value);         }         return new QName(ns, localName, prefix);     }     public static Node  fromSource(Source src) throws Exception {         Transformer trans = TransformerFactory.newInstance().newTransformer();         DOMResult res = new DOMResult();         trans.transform(src, res);         return res.getNode();     } }