Here you can find the source of getClosestAncestorWithAttribute(Node node, String ancestorName, String attributeName)
node
with name ancestorName
, and return the first ancestor for which an attribute named attributeName
is present.
Parameter | Description |
---|---|
node | node |
ancestorName | ancestorName |
attributeName | attributeName |
public static Element getClosestAncestorWithAttribute(Node node, String ancestorName, String attributeName)
//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; } }