blob: 42b7ede78cd1cc6fc35cb3785e82e08d6eb6e8e6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2008 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.pde.internal.ua.core;
import org.w3c.dom.Attr;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
public class CheatSheetUtil {
/**
* Recursively finds and accumulates all element's text and element children
* into a String in raw XML form
*
* @param element
* @return
*/
public static String parseElementText(Element element) {
// Puts all Text nodes in the full depth of the sub-tree
// underneath this Node
// i.e., there are neither adjacent Text nodes nor empty Text nodes.
element.normalize();
// Process only if there are children
if (element.getChildNodes().getLength() > 0) {
NodeList children = element.getChildNodes();
StringBuffer buffer = new StringBuffer();
// Traverse over each childe
for (int i = 0; i < children.getLength(); i++) {
Node node = children.item(i);
if (node.getNodeType() == Node.TEXT_NODE) {
// Accumulate the text children
buffer.append(((Text) node).getData());
} else if (node.getNodeType() == Node.ELEMENT_NODE) {
Element subElement = (Element) node;
// Append the open bracket
buffer.append('<');
// Append the element name
buffer.append(subElement.getNodeName());
// Parse element attributes
String elementAttributeText = parseElementAttributes(subElement);
// Append the attributes (if any)
if (elementAttributeText != null) {
buffer.append(elementAttributeText);
}
// Recursively accumulate element children
String value = parseElementText(subElement);
// Determine whether the element has any content or not
if (value.length() > 0) {
// The element had children
// Enclose the accumulated children with start and end
// tags
// Close off start element
buffer.append('>');
// Append element content
buffer.append(value);
// Append open bracket for end element tag
buffer.append('<');
buffer.append('/');
buffer.append(subElement.getNodeName());
} else {
// The element had no children
// Generate an abbreviated element tag
buffer.append('/');
}
// Append the close bracket
buffer.append('>');
}
}
// Return all accumulated children under the input element as a raw
// XML string
return buffer.toString();
}
return ""; //$NON-NLS-1$
}
/**
* Aggregates all attributes from the given element, formats then into the
* proper key="value" XML format and returns them as one String
*
* @param element
* @return The formatted String or null if the element has no attributes
*/
private static String parseElementAttributes(Element element) {
// Verify we have attributes
if (element.hasAttributes() == false) {
return null;
}
// Create the buffer
StringBuffer buffer = new StringBuffer();
// Get the attributes
NamedNodeMap attributeMap = element.getAttributes();
// Accumulate all attributes
for (int i = 0; i < attributeMap.getLength(); i++) {
Node node = attributeMap.item(i);
if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
Attr attribute = (Attr) node;
// Append space before attribute
buffer.append(' ');
// Append attribute name
buffer.append(attribute.getName());
// Append =
buffer.append('=');
// Append quote
buffer.append('"');
// Append attribute value
buffer.append(attribute.getValue());
// Append quote
buffer.append('"');
}
}
return buffer.toString();
}
}