Get the content of an optional child element : DOM Element « XML « Java






Get the content of an optional child element

    

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: 70500 $
 */
public class XmlHelper {

  /**
   * 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.
   */
  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;
  }

  /**
   * 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<Element> 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<Element> goodChildren = new ArrayList<Element>();
    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((Element) 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<Element> goodChildren = getChildrenByTagName(element, tagName);

    if (goodChildren != null && goodChildren.hasNext()) {
      Element child = 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
   */
  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
   */
  public static Element getOptionalChild(Element element, String tagName, Element defaultElement)
      throws Exception {
    Iterator<Element> goodChildren = getChildrenByTagName(element, tagName);

    if (goodChildren != null && goodChildren.hasNext()) {
      Element child = 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.
   */
  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.
   */
  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.
   */
  public static String getUniqueChildContent(Element element, String tagName) throws Exception {
    return getElementContent(getUniqueChild(element, tagName));
  }

}

   
    
    
    
  








Related examples in the same category

1.Add Text object to an Element.
2.Add a new element to the given parent
3.Add an entity to a specified Element.
4.Adds the child element with the given text
5.Clean text from Node
6.Compare two DOM Nodes
7.Compare two DOM Nodes from JBoss
8.Create New Element And Set
9.Create New Element And Set Attribute
10.Create a new element
11.Find All Elements By Tag Name
12.Find All Elements By Tag Name Name Space
13.Find Element And Set Or Create And Set
14.Find Element Or Container
15.Find Element Or Create And Attribute
16.Find Element Or Create And Set
17.Find Element Or Create And Set Attribute
18.Get Element Boolean Value
19.Get Element Date Value
20.Get Element Float Value
21.Get Element Int Value
22.Get Element Long Value
23.Get Element QName
24.Get Element String Value
25.Get Element Text
26.Get Elements by parent element
27.Get First Element
28.Get Next Element
29.Get child from an element by name
30.Get content from element
31.Get the content of the given element.
32.Get the first child element
33.Get the first text node associated with this element
34.Get the next sibling element
35.Get the next sibling with the same name and type
36.Get the raw text content of a node or null if there is no text
37.Get the specified text node associated with this element
38.Get the trimed text content of a node or null if there is no text
39.Get trimmed text content of a node or null if there is no text
40.Gets the child of the specified element having the specified unique name
41.Has Attribute
42.Remove Attribute
43.DOM Util: get Element Text
44.DOM helper for root element
45.Return a list of named Elements with a specific attribute value.
46.Return a list of named Elements.
47.Return child elements with specified name.
48.Return the first element child with the specified qualified name.
49.Return the first named Element found. Null if none.
50.Returns a list of child elements with the given name.
51.Returns an array of text values of a child element.
52.Returns an iterator over the children of the given element with the given tag name.
53.Returns text value of a child element. Returns null if there is no child element found.
54.Returns the first child element with the given name.
55.Returns the first element that has the specified local name.
56.Returns the text of the element
57.Moves the content of the given element to the given element
58.Import Elements
59.Find Container Else Create One
60.Create New Container
61.Macro to get the content of a unique child element.
62.Convert node element To String
63.Convert Element To Stream
64.Get the first element child.
65.Use the Document.getElementsByTagName() method to quickly and easily locate elements by name.
66.Get element by tag from Element
67.Get element by tag from Document
68.Iterable getChildElements(final Element e