From 7439bd659e4befa5786b3455cf6ceb34825736e7 Mon Sep 17 00:00:00 2001 From: Jonathan Bauer Date: Wed, 25 Apr 2018 18:35:04 +0200 Subject: [vbox] new XmlHelper class + usage thereof --- src/main/java/org/openslx/util/XmlHelper.java | 108 ++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 src/main/java/org/openslx/util/XmlHelper.java (limited to 'src/main/java/org/openslx/util/XmlHelper.java') diff --git a/src/main/java/org/openslx/util/XmlHelper.java b/src/main/java/org/openslx/util/XmlHelper.java new file mode 100644 index 0000000..70c5be8 --- /dev/null +++ b/src/main/java/org/openslx/util/XmlHelper.java @@ -0,0 +1,108 @@ +package org.openslx.util; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.OutputKeys; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import javax.xml.xpath.XPath; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpressionException; +import javax.xml.xpath.XPathFactory; + +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +public class XmlHelper +{ + private final static Logger LOGGER = Logger.getLogger( XmlHelper.class ); + + // TODO check thread-safety + public static final XPath XPath = XPathFactory.newInstance().newXPath(); + private static DocumentBuilder dBuilder; + static { + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + dbFactory.setIgnoringComments( true ); + try { + dBuilder = dbFactory.newDocumentBuilder(); + } catch ( ParserConfigurationException e ) { + LOGGER.error( "Failed to initalize DOM parser with default configurations." ); + } + } + + public static Document parseDocumentFromStream( InputStream is ) + { + Document doc = null; + try { + doc = dBuilder.parse( is ); + } catch ( SAXException | IOException e ) { + LOGGER.error( "Failed to parse input stream to document." ); + } + if ( doc == null ) + return null; + doc.getDocumentElement().normalize(); + return doc; + } + + public static Document removeFormattingNodes( Document doc ) + { + NodeList empty; + try { + empty = (NodeList)XPath.evaluate( "//text()[normalize-space(.) = '']", + doc, XPathConstants.NODESET ); + } catch ( XPathExpressionException e ) { + LOGGER.error( "Bad XPath expression to find all empty text nodes." ); + return null; + } + + for ( int i = 0; i < empty.getLength(); i++ ) { + Node node = empty.item( i ); + node.getParentNode().removeChild( node ); + } + return doc; + } + + public static String getUnformattedXml( InputStream is ) + { + // prune empty text nodes, essentially removing all formatting + Document doc = parseDocumentFromStream( is ); + return getXmlFromDocument( removeFormattingNodes( doc ), false ); + } + + public static String getFormattedXml( InputStream is ) + { + Document doc = parseDocumentFromStream( is ); + return getXmlFromDocument( doc, true ); + } + + public static String getXmlFromDocument( Document doc, boolean humanReadable ) + { + try { + StringWriter writer = new StringWriter(); + TransformerFactory tf = TransformerFactory.newInstance(); + Transformer transformer = tf.newTransformer(); + transformer.setOutputProperty( OutputKeys.OMIT_XML_DECLARATION, "no" ); + transformer.setOutputProperty( OutputKeys.ENCODING, "UTF-8" ); + transformer.setOutputProperty( OutputKeys.METHOD, "xml" ); + if ( humanReadable ) { + transformer.setOutputProperty( OutputKeys.INDENT, "yes" ); + transformer.setOutputProperty( "{http://xml.apache.org/xslt}indent-amount", "2" ); + } + transformer.transform( new DOMSource( doc ), new StreamResult( writer ) ); + return writer.toString(); + } catch ( Exception ex ) { + LOGGER.error( "Failed to transform XML to String: ", ex ); + return null; + } + } +} -- cgit v1.2.3-55-g7522