/* * Copyright 2001-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package samples.addr; import org.w3c.dom.Attr; import org.w3c.dom.CharacterData; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * @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; } }