Mega Code Archive

 
Categories / Java / XML
 

DOM Utils

/*  * The Apache Software License, Version 1.1  *  *  * Copyright (c) 2000 The Apache Software Foundation.  All rights   * reserved.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  *  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions and the following disclaimer.   *  * 2. 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.  *  * 3. The end-user documentation included with the redistribution,  *    if any, must include the following acknowledgment:    *       "This product includes software developed by the  *        Apache Software Foundation (http://www.apache.org/)."  *    Alternately, this acknowledgment may appear in the software itself,  *    if and wherever such third-party acknowledgments normally appear.  *  * 4. The names "SOAP" and "Apache Software Foundation" must  *    not be used to endorse or promote products derived from this  *    software without prior written permission. For written   *    permission, please contact apache@apache.org.  *  * 5. Products derived from this software may not be called "Apache",  *    nor may "Apache" appear in their name, without prior written  *    permission of the Apache Software Foundation.  *  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR  * ITS 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.  *   *  * This software consists of voluntary contributions made by many  * individuals on behalf of the Apache Software Foundation and was  * originally based on software copyright (c) 2000, International  * Business Machines, Inc., http://www.apache.org.  For more  * information on the Apache Software Foundation, please see  * <http://www.apache.org/>.  */ import org.w3c.dom.*; /**  * @author Matthew J. Duftler  * @author Sanjiva Weerawarana  */ public class DOMUtils {   /**    * The namespaceURI represented by the prefix <code>xmlns</code>.    */   private static String NS_URI_XMLNS = "http://www.w3.org/2000/xmlns/";   /**    * Returns the value of an attribute of an element. Returns null    * if the attribute is not found (whereas Element.getAttribute    * returns "" if an attrib is not found).    *    * @param el       Element whose attrib is looked for    * @param attrName name of attribute to look for     * @return the attribute value    */   static public String getAttribute (Element el, String attrName) {     String sRet = null;     Attr   attr = el.getAttributeNode(attrName);     if (attr != null) {       sRet = attr.getValue();     }     return sRet;   }   /**    * Returns the value of an attribute of an element. Returns null    * if the attribute is not found (whereas Element.getAttributeNS    * returns "" if an attrib is not found).    *    * @param el       Element whose attrib is looked for    * @param namespaceURI namespace URI of attribute to look for     * @param localPart local part of attribute to look for     * @return the attribute value    */   static public String getAttributeNS (Element el,                                        String namespaceURI,                                        String localPart) {     String sRet = null;     Attr   attr = el.getAttributeNodeNS (namespaceURI, localPart);     if (attr != null) {       sRet = attr.getValue ();     }     return sRet;   }   /**    * Concat all the text and cdata node children of this elem and return    * the resulting text.    *    * @param parentEl the element whose cdata/text node values are to    *                 be combined.    * @return the concatanated string.    */   static public String getChildCharacterData (Element parentEl) {     if (parentEl == null) {       return null;     }      Node          tempNode = parentEl.getFirstChild();     StringBuffer  strBuf   = new StringBuffer();     CharacterData charData;     while (tempNode != null) {       switch (tempNode.getNodeType()) {         case Node.TEXT_NODE :         case Node.CDATA_SECTION_NODE : charData = (CharacterData)tempNode;                                        strBuf.append(charData.getData());                                        break;       }       tempNode = tempNode.getNextSibling();     }     return strBuf.toString();   }   /**    * Return the first child element of the given element. Null if no    * children are found.    *    * @param elem Element whose child is to be returned    * @return the first child element.    */   public static Element getFirstChildElement (Element elem) {     for (Node n = elem.getFirstChild (); n != null; n = n.getNextSibling ()) {       if (n.getNodeType () == Node.ELEMENT_NODE) {         return (Element) n;       }     }     return null;   }   /**    * Return the next sibling element of the given element. Null if no    * more sibling elements are found.    *    * @param elem Element whose sibling element is to be returned    * @return the next sibling element.    */   public static Element getNextSiblingElement (Element elem) {     for (Node n = elem.getNextSibling (); n != null; n = n.getNextSibling ()) {       if (n.getNodeType () == Node.ELEMENT_NODE) {         return (Element) n;       }     }     return null;   }   /**    * Return the first child element of the given element which has the    * given attribute with the given value.    *    * @param elem      the element whose children are to be searched    * @param attrName  the attrib that must be present    * @param attrValue the desired value of the attribute    *    * @return the first matching child element.    */   public static Element findChildElementWithAttribute (Element elem,                     String attrName,                    String attrValue) {     for (Node n = elem.getFirstChild (); n != null; n = n.getNextSibling ()) {       if (n.getNodeType () == Node.ELEMENT_NODE) {         if (attrValue.equals (DOMUtils.getAttribute ((Element) n, attrName))) {           return (Element) n;         }       }     }     return  null;   }   /**     * Count number of children of a certain type of the given element.    *    * @param elem the element whose kids are to be counted    *    * @return the number of matching kids.    */   public static int countKids (Element elem, short nodeType) {     int nkids = 0;     for (Node n = elem.getFirstChild (); n != null; n = n.getNextSibling ()) {       if (n.getNodeType () == nodeType) {         nkids++;       }     }     return nkids;   }   /**    * Given a prefix and a node, return the namespace URI that the prefix    * has been associated with. This method is useful in resolving the    * namespace URI of attribute values which are being interpreted as    * QNames. If prefix is null, this method will return the default    * namespace.    *    * @param context the starting node (looks up recursively from here)    * @param prefix the prefix to find an xmlns:prefix=uri for    *    * @return the namespace URI or null if not found    */   public static String getNamespaceURIFromPrefix (Node context,                                                   String prefix) {     short nodeType = context.getNodeType ();     Node tempNode = null;     switch (nodeType)     {       case Node.ATTRIBUTE_NODE :       {         tempNode = ((Attr) context).getOwnerElement ();         break;       }       case Node.ELEMENT_NODE :       {         tempNode = context;         break;       }       default :       {         tempNode = context.getParentNode ();         break;       }     }     while (tempNode != null && tempNode.getNodeType () == Node.ELEMENT_NODE)     {       Element tempEl = (Element) tempNode;       String namespaceURI = (prefix == null)                             ? getAttribute (tempEl, "xmlns")                             : getAttributeNS (tempEl, NS_URI_XMLNS, prefix);       if (namespaceURI != null)       {         return namespaceURI;       }       else       {         tempNode = tempEl.getParentNode ();       }     }     return null;   }   public static Element getElementByID(Element el, String id)   {     if (el == null)       return null;     String thisId = el.getAttribute("id");     if (id.equals(thisId))       return el;          NodeList list = el.getChildNodes();     for (int i = 0; i < list.getLength(); i++) {       Node node = list.item(i);       if (node instanceof Element) {         Element ret = getElementByID((Element)node, id);         if (ret != null)           return ret;       }     }          return null;   } }