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

de.thksystems.util.xml.DomUtils Maven / Gradle / Ivy

/*
 * tksCommons
 * 
 * Author  : Thomas Kuhlmann (ThK-Systems, http://www.thk-systems.de)
 * License : LGPL (https://www.gnu.org/licenses/lgpl.html)
 */
package de.thksystems.util.xml;

import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;

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.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;

public final class DomUtils {

	private DomUtils() {
	}

	/**
	 * Returns the whole DOM-tree of the given {@link Node} as a list of {@link Node}s.
	 */
	public static List getNodeTreeAsList(Node node) {
		List nodeList = new ArrayList();
		addNodeRecursivelyToList(node, nodeList);
		return nodeList;
	}

	private static void addNodeRecursivelyToList(Node node, List nodeList) {
		nodeList.add(node);
		NodeList children = node.getChildNodes();
		for (int i = 0; children != null && i < children.getLength(); i++) {
			addNodeRecursivelyToList(children.item(i), nodeList);
		}
	}

	/**
	 * Returns the whole XML-{@link Node} or -{@link Document} as a {@link String}.
	 * 
	 * @param node
	 *            The {@link Node} to output as a {@link String}
	 * @param omitXmlDeclaration
	 *            true, if the xml-header should be omitted.
	 * @param encoding
	 *            Encoding of the text-ouptput
	 */
	public static String nodeToString(Node node, boolean omitXmlDeclaration, String encoding) {
		StringWriter sw = new StringWriter();
		try {
			Transformer t = TransformerFactory.newInstance().newTransformer();
			t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
			t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
			t.transform(new DOMSource(node), new StreamResult(sw));
		} catch (TransformerException te) {
			throw new IllegalArgumentException(te);
		}
		return sw.toString();
	}

	/**
	 * Returns the whole XML-{@link Node} or -{@link Document} as a {@link String} with 'UTF-8' encoding and xml-header.
	 */
	public static String nodeToString(Node node) {
		return nodeToString(node, false, StandardCharsets.UTF_8.name());
	}

	/**
	 * Creates a new {@link Element} with the given name, adds it to the parent {@link Node} and returns it.
	 */
	public static Element createAndAddElement(Node parentNode, String nodeName) {
		Document doc = getOwningDocument(parentNode);
		Element newElem = doc.createElement(nodeName);
		parentNode.appendChild(newElem);
		return newElem;
	}

	/**
	 * Returns the owning {@link Document}.
	 * 
	 * @return Owning {@link Document} or the {@link Node} itself, if it is a {@link Document}.
	 */
	public static Document getOwningDocument(Node parentNode) {
		if (parentNode instanceof Document) {
			return (Document) parentNode;
		}
		return parentNode.getOwnerDocument();
	}

	/**
	 * Creates a new {@link Attr}ibute with the given name and value, adds it to the parent {@link Node} and returns it.
	 */
	public static Attr createAndAddAttribute(Node parentNode, String attrName, String attrValue) {
		Document doc = getOwningDocument(parentNode);
		Attr attr = doc.createAttribute(attrName);
		attr.setValue(attrValue);
		parentNode.getAttributes().setNamedItem(attr);
		return attr;
	}

	/**
	 * Creates a new {@link Text}Node with the given texts, adds it to the parent {@link Node} and returns it.
	 */
	public static Text createAndAddTextNode(Node parentNode, String text) {
		Document doc = getOwningDocument(parentNode);
		Text textNode = doc.createTextNode(text);
		parentNode.appendChild(textNode);
		return textNode;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy