001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: * $Header:$
018: */
019: package org.apache.beehive.netui.util.xml;
020:
021: import java.util.List;
022: import java.util.ArrayList;
023:
024: import org.w3c.dom.Node;
025: import org.w3c.dom.Element;
026: import org.w3c.dom.NodeList;
027: import org.w3c.dom.Text;
028: import org.w3c.dom.Attr;
029:
030: /**
031: * <p>This class exists simply because DOM is so inconvenient to use.</p>
032: */
033: public final class DomUtils {
034:
035: /* do not construct */
036: private DomUtils() {
037: }
038:
039: /**
040: * <p>Returns the first child element with the given name. Returns
041: * <code>null</code> if not found.</p>
042: *
043: * @param parent parent element
044: * @param name name of the child element
045: * @return child element
046: */
047: public static Element getChildElementByName(Element parent,
048: String name) {
049: NodeList children = parent.getChildNodes();
050:
051: for (int i = 0; i < children.getLength(); i++) {
052: Node node = children.item(i);
053: if (node.getNodeType() == Node.ELEMENT_NODE) {
054: Element element = (Element) node;
055: if (element.getTagName().equals(name)) {
056: return element;
057: }
058: }
059: }
060:
061: return null;
062: }
063:
064: /**
065: * <p>Returns a list of child elements with the given
066: * name. Returns an empty list if there are no such child
067: * elements.</p>
068: *
069: * @param parent parent element
070: * @param name name of the child element
071: * @return child elements
072: */
073: public static List getChildElementsByName(Element parent,
074: String name) {
075: List elements = new ArrayList();
076:
077: NodeList children = parent.getChildNodes();
078:
079: for (int i = 0; i < children.getLength(); i++) {
080: Node node = children.item(i);
081: if (node.getNodeType() == Node.ELEMENT_NODE) {
082: Element element = (Element) node;
083: if (element.getTagName().equals(name)) {
084: elements.add(element);
085: }
086: }
087: }
088:
089: return elements;
090: }
091:
092: /**
093: * <p>Returns the text value of a child element. Returns
094: * <code>null</code> if there is no child element found.</p>
095: *
096: * @param parent parent element
097: * @param name name of the child element
098: * @return text value
099: */
100: public static String getChildElementText(Element parent, String name) {
101: // Get children
102: List list = DomUtils.getChildElementsByName(parent, name);
103:
104: if (list.size() == 1) {
105: Element child = (Element) list.get(0);
106:
107: StringBuffer buf = new StringBuffer();
108:
109: NodeList children = child.getChildNodes();
110: for (int i = 0; i < children.getLength(); i++) {
111: Node node = children.item(i);
112: if (node.getNodeType() == Node.TEXT_NODE
113: || node.getNodeType() == Node.CDATA_SECTION_NODE) {
114: Text text = (Text) node;
115: buf.append(text.getData().trim());
116: }
117: }
118:
119: return buf.toString();
120: } else {
121: return null;
122: }
123: }
124:
125: /**
126: * <p>Returns the text value of a child element. Returns
127: * <code>null</code> if there is no child element found.</p>
128: *
129: * @param element element
130: * @return text value
131: */
132: public static String getElementText(Element element) {
133: StringBuffer buf = new StringBuffer();
134:
135: NodeList children = element.getChildNodes();
136: for (int i = 0; i < children.getLength(); i++) {
137: Node node = children.item(i);
138: if (node.getNodeType() == Node.TEXT_NODE
139: || node.getNodeType() == Node.CDATA_SECTION_NODE) {
140: Text text = (Text) node;
141: buf.append(text.getData().trim());
142: }
143: }
144:
145: return buf.toString();
146: }
147:
148: /**
149: * <p>Returns an array of text values of a child element. Returns
150: * <code>null</code> if there is no child element found.</p>
151: *
152: * @param parent parent element
153: * @param name name of the child element
154: * @return text value
155: */
156: public static String[] getChildElementTextArr(Element parent,
157: String name) {
158: // Get all the elements
159: List children = getChildElementsByName(parent, name);
160:
161: String str[] = new String[children.size()];
162:
163: for (int i = 0; i < children.size(); i++) {
164: Node child = (Node) children.get(i);
165:
166: StringBuffer buf = new StringBuffer();
167:
168: NodeList nodes = child.getChildNodes();
169: for (int j = 0; j < nodes.getLength(); j++) {
170: Node node = nodes.item(j);
171: if (node.getNodeType() == Node.TEXT_NODE
172: || node.getNodeType() == Node.CDATA_SECTION_NODE) {
173: Text text = (Text) node;
174: buf.append(text.getData().trim());
175: }
176: }
177:
178: str[i] = buf.toString();
179: }
180:
181: return str;
182: }
183:
184: /**
185: * <p>Retutns the value of the named attribute of the given
186: * element. If there is no such attribute, returns null.</p>
187: *
188: * @param element element
189: * @param name name
190: * @return value
191: */
192: public static String getAttributeValue(Element element, String name) {
193: Attr attribute = element.getAttributeNode(name);
194: if (attribute == null) {
195: return null;
196: } else {
197: return attribute.getValue();
198: }
199: }
200: }
|