/* * Copyright (c) 2010, the Last.fm Java Project and Committers * All rights reserved. * * Redistribution and use of this software in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * - Redistributions of source code must retain the above * copyright notice, this list of conditions and the * following disclaimer. * * - Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the * following disclaimer in the documentation and/or other * materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package de.umass.xml; import java.util.ArrayList; import java.util.List; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * <code>DomElement</code> wraps around an {@link Element} and provides convenience methods. * * @author Janni Kovacs */ public class DomElement { private Element e; /** * Creates a new wrapper around the given {@link Element}. * * @param elem An w3c Element */ public DomElement(Element elem) { this.e = elem; } /** * @return the original Element */ public Element getElement() { return e; } /** * Tests if this element has an attribute with the specified name. * * @param name Name of the attribute. * @return <code>true</code> if this element has an attribute with the specified name. */ public boolean hasAttribute(String name) { return e.hasAttribute(name); } /** * Returns the attribute value to a given attribute name or <code>null</code> if the attribute doesn't exist. * * @param name The attribute's name * @return Attribute value or <code>null</code> */ public String getAttribute(String name) { return e.hasAttribute(name) ? e.getAttribute(name) : null; } /** * @return the text content of the element */ public String getText() { // XXX e.getTextContent() doesn't exsist under Android (Lukasz Wisniewski) /// getTextContent() is now available in at least Android 2.2 if not earlier, so we'll keep using that // return e.hasChildNodes() ? e.getFirstChild().getNodeValue() : null; return e.getTextContent(); } /** * Checks if this element has a child element with the given name. * * @param name The child's name * @return <code>true</code> if this element has a child element with the given name */ public boolean hasChild(String name) { NodeList list = e.getElementsByTagName(name); for (int i = 0, j = list.getLength(); i < j; i++) { Node item = list.item(i); if (item.getParentNode() == e) return true; } return false; } /** * Returns the child element with the given name or <code>null</code> if it doesn't exist. * * @param name The child's name * @return the child element or <code>null</code> */ public DomElement getChild(String name) { NodeList list = e.getElementsByTagName(name); if (list.getLength() == 0) return null; for (int i = 0, j = list.getLength(); i < j; i++) { Node item = list.item(i); if (item.getParentNode() == e) return new DomElement((Element) item); } return null; } /** * Returns the text content of a child node with the given name. If no such child exists or the child * does not have text content, <code>null</code> is returned. * * @param name The child's name * @return the child's text content or <code>null</code> */ public String getChildText(String name) { DomElement child = getChild(name); return child != null ? child.getText() : null; } /** * @return all children of this element */ public List<DomElement> getChildren() { return getChildren("*"); } /** * Returns all children of this element with the given tag name. * * @param name The children's tag name * @return all matching children */ public List<DomElement> getChildren(String name) { List<DomElement> l = new ArrayList<DomElement>(); NodeList list = e.getElementsByTagName(name); for (int i = 0; i < list.getLength(); i++) { Node node = list.item(i); if (node.getParentNode() == e) l.add(new DomElement((Element) node)); } return l; } /** * Returns this element's tag name. * * @return the tag name */ public String getTagName() { return e.getTagName(); } }