Java XML Attribute Get getClosestAncestorWithAttribute(Node node, String ancestorName, String attributeName)

Here you can find the source of getClosestAncestorWithAttribute(Node node, String ancestorName, String attributeName)

Description

Search upwards through the ancestors of node with name ancestorName, and return the first ancestor for which an attribute named attributeName is present.

License

Open Source License

Parameter

Parameter Description
node node
ancestorName ancestorName
attributeName attributeName

Return

(Element) a

Declaration

public static Element getClosestAncestorWithAttribute(Node node, String ancestorName, String attributeName) 

Method Source Code

//package com.java2s;
/**//from w  w  w .j a  v a  2s.c om
 * Copyright 2000-2006 DFKI GmbH.
 * All Rights Reserved.  Use is subject to license terms.
 *
 * This file is part of MARY TTS.
 *
 * MARY TTS is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, version 3 of the License.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

import org.w3c.dom.Element;

import org.w3c.dom.Node;

public class Main {
    /**
     * Search upwards through the ancestors of <code>node</code> with name <code>ancestorName</code>, and return the first
     * ancestor for which an attribute named <code>attributeName</code> is present. Return <code>null</code> if no such ancestor
     * exists.
     * 
     * @param node
     *            node
     * @param ancestorName
     *            ancestorName
     * @param attributeName
     *            attributeName
     * @return (Element) a
     */
    public static Element getClosestAncestorWithAttribute(Node node, String ancestorName, String attributeName) {
        for (Node a = getAncestor(node, ancestorName); a != null; a = getAncestor(a, ancestorName)) {
            if (a.getNodeType() == Node.ELEMENT_NODE && ((Element) a).hasAttribute(attributeName)) {
                // Recursion ends here.
                return (Element) a;
            }
        }
        // No such ancestor.
        return null;
    }

    /**
     * If <code>node</code> has an ancestor with name <code>ancestorName</code>, return that ancestor. Else return
     * <code>null</code>.
     * 
     * @param node
     *            node
     * @param ancestorName
     *            ancestorName
     * @return p if p.getNodeName equals ancestorName
     */
    public static Node getAncestor(Node node, String ancestorName) {
        Node p = node;
        while ((p = p.getParentNode()) != null) {
            if (p.getNodeName().equals(ancestorName))
                return p;
        }
        return null;
    }

    /**
     * If <code>node</code> has an ancestor with one of the names in <code>ancestorNames</code>, return the closest of these
     * ancestors. Else return <code>null</code>.
     * 
     * @param node
     *            node
     * @param ancestorNames
     *            ancestorNames
     * @return closestAncestor
     */
    public static Node getAncestor(Node node, String[] ancestorNames) {
        if (ancestorNames.length <= 0)
            throw new IllegalArgumentException("No ancestorNames provided.");
        Node closestAncestor = null;
        for (int i = 0; i < ancestorNames.length; i++) {
            Node ancestor = getAncestor(node, ancestorNames[i]);
            if (ancestor != null) {
                if (closestAncestor == null) {
                    closestAncestor = ancestor;
                } else if (isAncestor(closestAncestor, ancestor)) { // new one is closer than closest so far
                    closestAncestor = ancestor;
                } // else leave as is
            }
        }
        return closestAncestor;
    }

    /**
     * Verify if <code>ancestor</code> is an ancestor of <code>node</code>
     * 
     * @param ancestor
     *            ancestor
     * @param node
     *            node
     * @return true if ancestor equals to p, false otherwise
     */
    public static boolean isAncestor(Node ancestor, Node node) {
        Node p = node;
        while ((p = p.getParentNode()) != null) {
            if (ancestor == p)
                return true;
        }
        return false;
    }
}

Related

  1. getBooleanAttributeOptional(Node node, String attributeName, Boolean valueIfEmpty)
  2. getBooleanAttributeRequired(Node node, String attributeName)
  3. getBooleanAttributeValue(Node node, String attribute)
  4. getCascadeValue(final Element elem, final String attrName)
  5. getClosestAncestorWithAttribute(Node node, String ancestorName, String attributeName)
  6. getCurrentLevelAttributeTextValue(Element ele, String attribute)
  7. getDirectAttribute(Node node, String name)
  8. getDivHeadAttr(Element annotU, String attrName)
  9. getDoubleArrayTagAttribute(XMLStreamReader xmler, String attribute, double[] defaultValue)