001: /*
002: * Copyright 2004-2006 the original author or authors.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.compass.core.util;
018:
019: import java.util.ArrayList;
020: import java.util.List;
021:
022: import org.w3c.dom.*;
023:
024: /**
025: * Convenience methods for working with the DOM API,
026: * in particular for working with DOM Nodes and DOM Elements.
027: *
028: * @author kimchy
029: * @see org.w3c.dom.Node
030: * @see org.w3c.dom.Element
031: */
032: public abstract class DomUtils {
033:
034: public static String getElementAttribute(Element ele,
035: String attributeName) {
036: return getElementAttribute(ele, attributeName, null);
037: }
038:
039: /**
040: * Gets the attribute value from the element. If the attribute is <code>null</code>
041: * or is an empty string, will return the defaultValue.
042: */
043: public static String getElementAttribute(Element ele,
044: String attributeName, String defaultValue) {
045: String value = ele.getAttribute(attributeName);
046: if (value == null || !StringUtils.hasText(value)) {
047: return defaultValue;
048: }
049: return value;
050: }
051:
052: public static boolean getElementAttributeAsBoolean(Element ele,
053: String attributeName, boolean defaultValue) {
054: String sValue = getElementAttribute(ele, attributeName);
055: if (sValue == null) {
056: return defaultValue;
057: }
058: return Boolean.valueOf(sValue).booleanValue();
059: }
060:
061: /**
062: * Retrieve all child elements of the given DOM element that match
063: * the given element name. Only look at the direct child level of the
064: * given element; do not go into further depth (in contrast to the
065: * DOM API's <code>getElementsByTagName</code> method).
066: *
067: * @param ele the DOM element to analyze
068: * @param childEleName the child element name to look for
069: * @return a List of child <code>org.w3c.dom.Element</code> instances
070: * @see org.w3c.dom.Element
071: * @see org.w3c.dom.Element#getElementsByTagName
072: */
073: public static List getChildElementsByTagName(Element ele,
074: String childEleName) {
075: return getChildElementsByTagName(ele, childEleName, false);
076: }
077:
078: /**
079: * Retrieve all child elements of the given DOM element that match
080: * the given element name. Only look at the direct child level of the
081: * given element; do not go into further depth (in contrast to the
082: * DOM API's <code>getElementsByTagName</code> method).
083: * <p/>Can select whether or not to compare against the local name of
084: * the {@link org.w3c.dom.Element}
085: *
086: * @param ele the DOM element to analyze
087: * @param childEleName the child element name to look for
088: * @param localName whether to compare against the local node name
089: * @return a List of child <code>org.w3c.dom.Element</code> instances
090: * @see org.w3c.dom.Element
091: * @see org.w3c.dom.Element#getElementsByTagName
092: */
093: public static List getChildElementsByTagName(Element ele,
094: String childEleName, boolean localName) {
095: NodeList nl = ele.getChildNodes();
096: List childEles = new ArrayList();
097: for (int i = 0; i < nl.getLength(); i++) {
098: Node node = nl.item(i);
099: String name = (localName) ? node.getLocalName() : node
100: .getNodeName();
101: if (node instanceof Element && childEleName.equals(name)) {
102: childEles.add(node);
103: }
104: }
105: return childEles;
106: }
107:
108: /**
109: * Retruns the trimmed text value of the DOM element.
110: *
111: * @see #getTextValue(org.w3c.dom.Element)
112: */
113: public static String getTrimmedTextValue(Element valueEle) {
114: return getTextValue(valueEle).trim();
115: }
116:
117: /**
118: * Extract the text value from the given DOM element, ignoring XML comments.
119: * <p>Appends all CharacterData nodes and EntityReference nodes
120: * into a single String value, excluding Comment nodes.
121: *
122: * @see org.w3c.dom.CharacterData
123: * @see org.w3c.dom.EntityReference
124: * @see org.w3c.dom.Comment
125: */
126: public static String getTextValue(Element valueEle) {
127: StringBuffer value = new StringBuffer();
128: NodeList nl = valueEle.getChildNodes();
129: for (int i = 0; i < nl.getLength(); i++) {
130: Node item = nl.item(i);
131: if ((item instanceof org.w3c.dom.CharacterData && !(item instanceof Comment))
132: || item instanceof EntityReference) {
133: value.append(item.getNodeValue());
134: }
135: }
136: return value.toString();
137: }
138:
139: }
|