001: /*
002: * Copyright 2002-2007 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.springframework.util.xml;
018:
019: import java.util.ArrayList;
020: import java.util.List;
021:
022: import org.w3c.dom.CharacterData;
023: import org.w3c.dom.Comment;
024: import org.w3c.dom.Element;
025: import org.w3c.dom.EntityReference;
026: import org.w3c.dom.Node;
027: import org.w3c.dom.NodeList;
028:
029: import org.springframework.util.Assert;
030:
031: /**
032: * Convenience methods for working with the DOM API,
033: * in particular for working with DOM Nodes and DOM Elements.
034: *
035: * @author Juergen Hoeller
036: * @author Rob Harrop
037: * @author Costin Leau
038: * @since 1.2
039: * @see org.w3c.dom.Node
040: * @see org.w3c.dom.Element
041: */
042: public abstract class DomUtils {
043:
044: /**
045: * Retrieve all child elements of the given DOM element that match
046: * the given element name. Only look at the direct child level of the
047: * given element; do not go into further depth (in contrast to the
048: * DOM API's <code>getElementsByTagName</code> method).
049: * @param ele the DOM element to analyze
050: * @param childEleName the child element name to look for
051: * @return a List of child <code>org.w3c.dom.Element</code> instances
052: * @see org.w3c.dom.Element
053: * @see org.w3c.dom.Element#getElementsByTagName
054: */
055: public static List getChildElementsByTagName(Element ele,
056: String childEleName) {
057: NodeList nl = ele.getChildNodes();
058: List childEles = new ArrayList();
059: for (int i = 0; i < nl.getLength(); i++) {
060: Node node = nl.item(i);
061: if (node instanceof Element
062: && nodeNameEquals(node, childEleName)) {
063: childEles.add(node);
064: }
065: }
066: return childEles;
067: }
068:
069: /**
070: * Utility method that returns the first child element
071: * identified by its name.
072: * @param ele the DOM element to analyze
073: * @param childEleName the child element name to look for
074: * @return the <code>org.w3c.dom.Element</code> instance,
075: * or <code>null</code> if none found
076: */
077: public static Element getChildElementByTagName(Element ele,
078: String childEleName) {
079: NodeList nl = ele.getChildNodes();
080: for (int i = 0; i < nl.getLength(); i++) {
081: Node node = nl.item(i);
082: if (node instanceof Element
083: && nodeNameEquals(node, childEleName)) {
084: return (Element) node;
085: }
086: }
087: return null;
088: }
089:
090: /**
091: * Utility method that returns the first child element value
092: * identified by its name.
093: * @param ele the DOM element to analyze
094: * @param childEleName the child element name to look for
095: * @return the extracted text value,
096: * or <code>null</code> if no child element found
097: */
098: public static String getChildElementValueByTagName(Element ele,
099: String childEleName) {
100: Element child = getChildElementByTagName(ele, childEleName);
101: return (child != null ? getTextValue(child) : null);
102: }
103:
104: /**
105: * Namespace-aware equals comparison. Returns <code>true</code> if either
106: * {@link Node#getLocalName} or {@link Node#getNodeName} equals <code>desiredName</code>,
107: * otherwise returns <code>false</code>.
108: */
109: public static boolean nodeNameEquals(Node node, String desiredName) {
110: Assert.notNull(node, "Node must not be null");
111: Assert.notNull(desiredName, "Desired name must not be null");
112: return (desiredName.equals(node.getNodeName()) || desiredName
113: .equals(node.getLocalName()));
114: }
115:
116: /**
117: * Extract the text value from the given DOM element, ignoring XML comments.
118: * <p>Appends all CharacterData nodes and EntityReference nodes
119: * into a single String value, excluding Comment nodes.
120: * @see CharacterData
121: * @see EntityReference
122: * @see Comment
123: */
124: public static String getTextValue(Element valueEle) {
125: StringBuffer value = new StringBuffer();
126: NodeList nl = valueEle.getChildNodes();
127: for (int i = 0; i < nl.getLength(); i++) {
128: Node item = nl.item(i);
129: if ((item instanceof CharacterData && !(item instanceof Comment))
130: || item instanceof EntityReference) {
131: value.append(item.getNodeValue());
132: }
133: }
134: return value.toString();
135: }
136:
137: }
|