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