Gets the child of the specified element having the specified name. If the child with this name doesn't exist then null is returned instead. : DOM Tree « XML « Java






Gets the child of the specified element having the specified name. If the child with this name doesn't exist then null is returned instead.

   

import java.util.ArrayList;
import java.util.Iterator;

import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * A utility class to cover up the rough bits of xml parsing
 * 
 * @author <a href="mailto:chris@kimptoc.net">Chris Kimpton</a>
 * @version $Revision: 2787 $
 */
@SuppressWarnings("unchecked")
public class XmlHelper {

  /**
   * Returns an iterator over the children of the given element with the given
   * tag name.
   * 
   * @param element
   *          The parent element
   * @param tagName
   *          The name of the desired child
   * @return An interator of children or null if element is null.
   */
  public static Iterator getChildrenByTagName(Element element, String tagName) {
    if (element == null)
      return null;
    // getElementsByTagName gives the corresponding elements in the whole
    // descendance. We want only children

    NodeList children = element.getChildNodes();
    ArrayList goodChildren = new ArrayList();
    for (int i = 0; i < children.getLength(); i++) {
      Node currentChild = children.item(i);
      if (currentChild.getNodeType() == Node.ELEMENT_NODE
          && ((Element) currentChild).getTagName().equals(tagName)) {
        goodChildren.add(currentChild);
      }
    }
    return goodChildren.iterator();
  }

  /**
   * Gets the child of the specified element having the specified unique name.
   * If there are more than one children elements with the same name and
   * exception is thrown.
   * 
   * @param element
   *          The parent element
   * @param tagName
   *          The name of the desired child
   * @return The named child.
   * 
   * @throws Exception
   *           Child was not found or was not unique.
   */
  public static Element getUniqueChild(Element element, String tagName) throws Exception {
    Iterator goodChildren = getChildrenByTagName(element, tagName);

    if (goodChildren != null && goodChildren.hasNext()) {
      Element child = (Element) goodChildren.next();
      if (goodChildren.hasNext()) {
        throw new Exception("expected only one " + tagName + " tag");
      }
      return child;
    } else {
      throw new Exception("expected one " + tagName + " tag");
    }
  }

  /**
   * Gets the child of the specified element having the specified name. If the
   * child with this name doesn't exist then null is returned instead.
   * 
   * @param element
   *          the parent element
   * @param tagName
   *          the name of the desired child
   * @return either the named child or null
   * @throws Exception
   */
  public static Element getOptionalChild(Element element, String tagName) throws Exception {
    return getOptionalChild(element, tagName, null);
  }

  /**
   * Gets the child of the specified element having the specified name. If the
   * child with this name doesn't exist then the supplied default element is
   * returned instead.
   * 
   * @param element
   *          the parent element
   * @param tagName
   *          the name of the desired child
   * @param defaultElement
   *          the element to return if the child doesn't exist
   * @return either the named child or the supplied default
   * @throws Exception
   */
  public static Element getOptionalChild(Element element, String tagName, Element defaultElement)
      throws Exception {
    Iterator goodChildren = getChildrenByTagName(element, tagName);

    if (goodChildren != null && goodChildren.hasNext()) {
      Element child = (Element) goodChildren.next();
      if (goodChildren.hasNext()) {
        throw new Exception("expected only one " + tagName + " tag");
      }
      return child;
    } else {
      return defaultElement;
    }
  }

  /**
   * Get the content of the given element.
   * 
   * @param element
   *          The element to get the content for.
   * @return The content of the element or null.
   * @throws Exception
   */
  public static String getElementContent(final Element element) throws Exception {
    return getElementContent(element, null);
  }

  /**
   * Get the content of the given element.
   * 
   * @param element
   *          The element to get the content for.
   * @param defaultStr
   *          The default to return when there is no content.
   * @return The content of the element or the default.
   * @throws Exception
   */
  public static String getElementContent(Element element, String defaultStr) throws Exception {
    if (element == null)
      return defaultStr;

    NodeList children = element.getChildNodes();
    String result = "";
    for (int i = 0; i < children.getLength(); i++) {
      if (children.item(i).getNodeType() == Node.TEXT_NODE
          || children.item(i).getNodeType() == Node.CDATA_SECTION_NODE) {
        result += children.item(i).getNodeValue();
      } else if (children.item(i).getNodeType() == Node.COMMENT_NODE) {
        // Ignore comment nodes
      }
    }
    return result.trim();
  }

  /**
   * Macro to get the content of a unique child element.
   * 
   * @param element
   *          The parent element.
   * @param tagName
   *          The name of the desired child.
   * @return The element content or null.
   * @throws Exception
   */
  public static String getUniqueChildContent(Element element, String tagName) throws Exception {
    return getElementContent(getUniqueChild(element, tagName));
  }

  /**
   * Macro to get the content of an optional child element.
   * 
   * @param element
   *          The parent element.
   * @param tagName
   *          The name of the desired child.
   * @return The element content or null.
   * @throws Exception
   */
  public static String getOptionalChildContent(Element element, String tagName) throws Exception {
    return getElementContent(getOptionalChild(element, tagName));
  }

  public static boolean getOptionalChildBooleanContent(Element element, String name)
      throws Exception {
    Element child = getOptionalChild(element, name);
    if (child != null) {
      String value = getElementContent(child).toLowerCase();
      return value.equals("true") || value.equals("yes");
    }

    return false;
  }

}

   
    
    
  








Related examples in the same category

1.Creating a new DOM tree
2.Create new DOM tree with fully qualified element names
3.Traverse the DOM tree as a list
4.Traverse the DOM tree using TreeWalker
5.Reading a DOM tree from XML document
6.Copying a Subtree of Nodes in a DOM Document
7.Copying a Subtree of Nodes from One DOM Document to Another
8.Saving a DOM tree to XML file javax.xml.parsers (JAXP)
9.Using ranges in DOM tree
10.Accessing different types of DOM tree nodes
11.Manipulate w3c DOM trees
12.Returns an iterator over the children of the given element with the given tag name
13.Gets the child of the specified element having the specified unique name
14.Traverse a DOM tree in order to get information about the document.
15.Get this Document's root node
16.Returns the concatenated child text of the specified node.
17.Get the first child of the specified type.
18.Get the first child's content ( ie it's included TEXT node ).
19.Get the first direct child with a given type
20.Print Tree node
21.DOM Util: get Child Text
22.Search earlier siblings for a given node
23.Search for a named child of a given node
24.Search our next siblings for a given node
25.Search up the tree for a given node
26.Return the next sibling with a given name and type
27.Get Child Content
28.Traverse a DOM tree in order to print a document that is parsed.