All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unitedinternet.cosmo.util.DomWriter Maven / Gradle / Ivy

/*
 * Copyright 2007 Open Source Applications Foundation
 * 
 * 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.
 */
package org.unitedinternet.cosmo.util;

import java.io.IOException;
import java.io.StringWriter;

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Attr;
import org.w3c.dom.CharacterData;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * 

* A helper for serializing a DOM structure to a UTF-8 string. *

*

* Only element, text and character data nodes are serialized. All other nodes are ignored. Whitespaces is significant. * Document order is preserved. Element attributes are serialized in document order. Prefixes for elements and * attributes are preserved. *

*/ public class DomWriter { private static final Logger LOG = LoggerFactory.getLogger(DomWriter.class); private static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newInstance(); public static String write(Node n) throws XMLStreamException, IOException { XMLStreamWriter writer = null; try { if ((n.getNamespaceURI() != null && n.getAttributes().getLength() > 0) && (n.getNamespaceURI().equals(n.getAttributes().item(0).getNodeValue()))) { n.getAttributes().removeNamedItem(n.getAttributes().item(0).getNodeName()); } StringWriter out = new StringWriter(); writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(out); writeNode(n, writer); writer.close(); return out.toString(); } finally { if (writer != null) { try { writer.close(); } catch (XMLStreamException e2) { LOG.warn("Unable to close XML writer", e2); } } } } private static void writeNode(Node n, XMLStreamWriter writer) throws XMLStreamException { if (n.getNodeType() == Node.ELEMENT_NODE) { writeElement((Element) n, writer); } else if (n.getNodeType() == Node.CDATA_SECTION_NODE || n.getNodeType() == Node.TEXT_NODE) { writeCharacters((CharacterData) n, writer); } else { LOG.warn("Skipping element " + n.getNodeName()); } } private static void writeElement(Element e, XMLStreamWriter writer) throws XMLStreamException { String local = e.getLocalName(); if (local == null) { local = e.getNodeName(); } String ns = e.getNamespaceURI(); if (ns != null) { String prefix = e.getPrefix(); if (prefix != null) { writer.writeStartElement(prefix, local, ns); writer.writeNamespace(prefix, ns); } else { writer.setDefaultNamespace(ns); writer.writeStartElement(ns, local); writer.writeDefaultNamespace(ns); } } else { writer.writeStartElement(local); } NamedNodeMap attributes = e.getAttributes(); for (int i = 0; i < attributes.getLength(); i++) { writeAttribute((Attr) attributes.item(i), writer); } NodeList children = e.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { writeNode(children.item(i), writer); } writer.writeEndElement(); } private static void writeCharacters(CharacterData cd, XMLStreamWriter writer) throws XMLStreamException { writer.writeCharacters(cd.getData()); } private static void writeAttribute(Attr a, XMLStreamWriter writer) throws XMLStreamException { String local = a.getLocalName(); if (local == null) { local = a.getNodeName(); } String ns = a.getNamespaceURI(); String value = a.getValue(); // was handled by writing the default namespace in writeElement if (local.equals("xmlns")) { return; } if (ns != null) { String prefix = a.getPrefix(); if (prefix != null) { writer.writeAttribute(prefix, ns, local, value); } else { writer.writeAttribute(ns, local, value); } } else { writer.writeAttribute(local, value); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy