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

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

The newest version!
/*
 * 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.Reader;
import java.io.StringReader;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

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

/**
 * 

* A helper for deserializing a UTF-8 string into a DOM structure. *

*

* 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 DomReader { private static final Logger LOG = LoggerFactory.getLogger(DomReader.class); private static final XMLInputFactory XML_INPUT_FACTORY = XMLInputFactory.newInstance(); private static final DocumentBuilderFactory BUILDER_FACTORY = DocumentBuilderFactory.newInstance(); public static Node read(String in) throws ParserConfigurationException, XMLStreamException, IOException { return read(new StringReader(in)); } public static Node read(Reader in) throws ParserConfigurationException, XMLStreamException, IOException { XMLStreamReader reader = null; try { Document d = BUILDER_FACTORY.newDocumentBuilder().newDocument(); reader = XML_INPUT_FACTORY.createXMLStreamReader(in); return readNode(d, reader); } finally { if (reader != null) { try { reader.close(); } catch (XMLStreamException e2) { LOG.warn("Unable to close XML reader", e2); } } } } private static Node readNode(Document d, XMLStreamReader reader) throws XMLStreamException { Node root = null; Node current = null; while (reader.hasNext()) { reader.next(); if (reader.isEndElement()) { if (current.getParentNode() == null) { break; } current = current.getParentNode(); } if (reader.isStartElement()) { Element e = readElement(d, reader); if (root == null) { root = e; } if (current != null) { current.appendChild(e); } current = e; continue; } if (reader.isCharacters()) { CharacterData cd = d.createTextNode(reader.getText()); if (root == null) { return cd; } if (current == null) { return cd; } current.appendChild(cd); continue; } } return root; } private static Element readElement(Document d, XMLStreamReader reader) throws XMLStreamException { Element e = null; String local = reader.getLocalName(); String ns = reader.getNamespaceURI(); if (ns != null && !ns.equals("")) { String prefix = reader.getPrefix(); String qualified = prefix != null && !prefix.isEmpty() ? prefix + ":" + local : local; e = d.createElementNS(ns, qualified); } else { e = d.createElement(local); } for (int i = 0; i < reader.getAttributeCount(); i++) { Attr a = readAttribute(i, d, reader); if (a.getNamespaceURI() != null) { e.setAttributeNodeNS(a); } else { e.setAttributeNode(a); } } return e; } private static Attr readAttribute(int i, Document d, XMLStreamReader reader) throws XMLStreamException { Attr a = null; String local = reader.getAttributeLocalName(i); String ns = reader.getAttributeNamespace(i); if (ns != null && !ns.equals("")) { String prefix = reader.getAttributePrefix(i); String qualified = prefix != null ? prefix + ":" + local : local; a = d.createAttributeNS(ns, qualified); } else { a = d.createAttribute(reader.getAttributeLocalName(i)); } a.setValue(reader.getAttributeValue(i)); return a; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy