/*
- * Copyright 2005 the original author or authors.
- *
+ * Copyright 2005-2010 the original author or authors.
+ *
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*/
package org.wamblee.xml;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.apache.xml.serialize.OutputFormat;
-import org.apache.xml.serialize.XMLSerializer;
-
-import org.dom4j.DocumentException;
-
-import org.dom4j.io.DOMReader;
-import org.dom4j.io.DOMWriter;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.xml.sax.SAXException;
-
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import javax.xml.XMLConstants;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
+import javax.xml.validation.Validator;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.bootstrap.DOMImplementationRegistry;
+import org.w3c.dom.ls.DOMImplementationLS;
+import org.w3c.dom.ls.LSException;
+import org.w3c.dom.ls.LSInput;
+import org.w3c.dom.ls.LSParser;
+import org.xml.sax.SAXException;
/**
* Some basic XML utilities for common reoccuring tasks for DOM documents.
* @author Erik Brakkee
*/
public final class DomUtils {
- private static final Log LOG = LogFactory.getLog(DomUtils.class);
+ private static final Logger LOG = Logger
+ .getLogger(DomUtils.class.getName());
/**
* Disabled default constructor.
*/
public static Document read(InputStream aIs) throws XMLException {
try {
- DocumentBuilder builder = DocumentBuilderFactory.newInstance()
- .newDocumentBuilder();
+ DOMImplementationRegistry registry = DOMImplementationRegistry
+ .newInstance();
- return builder.parse(aIs);
- } catch (SAXException e) {
+ DOMImplementationLS impl = (DOMImplementationLS) registry
+ .getDOMImplementation("LS");
+
+ LSParser builder = impl.createLSParser(
+ DOMImplementationLS.MODE_SYNCHRONOUS, null);
+ LSInput input = impl.createLSInput();
+ input.setByteStream(aIs);
+ return builder.parse(input);
+ } catch (IllegalAccessException e) {
throw new XMLException(e.getMessage(), e);
- } catch (IOException e) {
+ } catch (InstantiationException e) {
throw new XMLException(e.getMessage(), e);
- } catch (ParserConfigurationException e) {
+ } catch (ClassNotFoundException e) {
+ throw new XMLException(e.getMessage(), e);
+ } catch (LSException e) {
throw new XMLException(e.getMessage(), e);
} finally {
try {
aIs.close();
} catch (Exception e) {
- LOG.warn("Error closing XML file", e);
+ LOG.log(Level.WARNING, "Error closing XML file", e);
}
}
}
public static Document readAndValidate(InputStream aIs, InputStream aSchema)
throws XMLException {
try {
+ Document doc = read(aIs);
final Schema schema = SchemaFactory.newInstance(
XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(
new StreamSource(aSchema));
+ Validator validator = schema.newValidator();
+ validator.validate(new DOMSource(doc));
- final DocumentBuilderFactory factory = DocumentBuilderFactory
- .newInstance();
- factory.setValidating(true);
- factory.setNamespaceAware(true);
- factory.setSchema(schema);
-
- return factory.newDocumentBuilder().parse(aIs);
+ return doc;
} catch (SAXException e) {
throw new XMLException(e.getMessage(), e);
} catch (IOException e) {
throw new XMLException(e.getMessage(), e);
- } catch (ParserConfigurationException e) {
- throw new XMLException(e.getMessage(), e);
} finally {
try {
aSchema.close();
} catch (Exception e) {
- LOG.warn("Error closing schema", e);
+ LOG.log(Level.WARNING, "Error closing schema", e);
}
try {
aIs.close();
} catch (Exception e) {
- LOG.warn("Error closing XML file", e);
+ LOG.log(Level.WARNING, "Error closing XML file", e);
}
}
}
*/
public static void serialize(Document aDocument, OutputStream aOs)
throws IOException {
- XMLSerializer serializer = new XMLSerializer(aOs, new OutputFormat());
- serializer.serialize(aDocument);
+ try {
+ TransformerFactory factory = TransformerFactory.newInstance();
+ Transformer identityTransform = factory.newTransformer();
+ DOMSource source = new DOMSource(aDocument);
+ StreamResult result = new StreamResult(aOs);
+ identityTransform.transform(source, result);
+ } catch (TransformerException e) {
+ throw new IOException(e.getMessage(), e);
+ }
}
/**
return os.toString();
}
- /**
- * Converts a dom4j document into a w3c DOM document.
- *
- * @param aDocument
- * Document to convert.
- *
- * @return W3C DOM document.
- *
- */
- public static Document convert(org.dom4j.Document aDocument)
- throws DocumentException {
- return new DOMWriter().write(aDocument);
- }
-
- /**
- * Converts a W3C DOM document into a dom4j document.
- *
- * @param aDocument
- * Document to convert.
- *
- * @return Dom4j document.
- */
- public static org.dom4j.Document convert(Document aDocument) {
- return new DOMReader().read(aDocument);
- }
-
/**
* Removes duplicate attributes from a DOM tree.This is useful for
* postprocessing the output of JTidy as a workaround for a bug in JTidy.