Java XML Format format(final String xml)

Here you can find the source of format(final String xml)

Description

Parse string as XML document and return string with reformatted document.

License

Apache License

Parameter

Parameter Description
xml string with XML content

Exception

Parameter Description
TransformerException if it is not possible to transform document to string
SAXException if any parse errors occur

Return

reformatted content

Declaration

public static String format(final String xml) throws TransformerException, SAXException 

Method Source Code


//package com.java2s;
/*/*  ww w  .  j  a  v a2  s.c o m*/
 * Copyright 2007-2012 AjaxTags-Team
 *
 *
 * 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. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

import java.io.IOException;
import java.io.StringReader;
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.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

public class Main {
    /** Value for transformer output properties. */
    private static final String TRANSFORMER_YES = "yes";
    /** TransformerFactory. */
    private static final ThreadLocal<TransformerFactory> TRANSFORMER_FACTORY = new ThreadLocal<TransformerFactory>() {
        @Override
        protected TransformerFactory initialValue() {
            return TransformerFactory.newInstance();
        }
    };
    /** DocumentBuilderFactory. */
    private static final ThreadLocal<DocumentBuilderFactory> DOC_FACTORY = new ThreadLocal<DocumentBuilderFactory>() {
        @Override
        protected DocumentBuilderFactory initialValue() {
            final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            dbf.setValidating(false);
            dbf.setIgnoringElementContentWhitespace(true);
            return dbf;
        }
    };

    /**
     * Parse string as XML document and return string with reformatted document.
     *
     * @param xml
     *            string with XML content
     * @return reformatted content
     * @throws TransformerException
     *             if it is not possible to transform document to string
     * @throws SAXException
     *             if any parse errors occur
     */
    public static String format(final String xml) throws TransformerException, SAXException {
        return toString(getXMLDocument(xml));
    }

    /**
     * Transform document to string representation.
     *
     * @param document
     *            XHTML document
     * @return string representation of document
     * @throws TransformerException
     *             if it is not possible to create a Transformer instance or to transform document
     */
    public static String toString(final Document document) throws TransformerException {
        final StringWriter stringWriter = new StringWriter();
        final StreamResult streamResult = new StreamResult(stringWriter);
        final Transformer transformer = TRANSFORMER_FACTORY.get().newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, TRANSFORMER_YES);
        // set indent for XML
        transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
        // not all JavaSE have the same implementation
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
        // transformer.setOutputProperty(OutputKeys.METHOD, "html");
        // html method transforms <br/> into <br>, which cannot be re-parsed
        // transformer.setOutputProperty(OutputKeys.METHOD, "xhtml");
        // xhtml method does not work for my xalan transformer
        transformer.setOutputProperty(OutputKeys.METHOD, "xml");
        transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, TRANSFORMER_YES);
        transformer.transform(new DOMSource(document.getDocumentElement()), streamResult);
        return stringWriter.toString();
    }

    /**
     * Parse string with XML content to {@link org.w3c.dom.Document}.
     *
     * @param xml
     *            string with XML content
     * @return Document
     * @throws SAXException
     *             if any parse errors occur
     */
    public static Document getXMLDocument(final String xml) throws SAXException {
        try {
            return getNewDocumentBuilder().parse(new InputSource(new StringReader(xml)));
        } catch (IOException e) {
            throw new SAXException(e);
        } catch (ParserConfigurationException e) {
            throw new SAXException(e);
        }
    }

    /**
     * @return DocumentBuilder
     * @throws ParserConfigurationException
     *             if a DocumentBuilder cannot be created which satisfies the configuration
     *             requested
     */
    private static DocumentBuilder getNewDocumentBuilder() throws ParserConfigurationException {
        return DOC_FACTORY.get().newDocumentBuilder();
    }
}

Related

  1. applyTransformation(InputStream xsltStream, Map xsltParameters, InputStream inputXmlStream, OutputStream outputStream)
  2. format(Node node)
  3. format(Node node, String indent)
  4. format(String unformattedXml)
  5. formatAttributes(Node node)