Here you can find the source of getParentNamespaces(Element el)
Parameter | Description |
---|---|
el | the starting element |
public static Map<String, String> getParentNamespaces(Element el)
//package com.java2s; /*//from w w w . j av a 2 s . co m * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ import java.util.HashMap; import java.util.Map; import org.w3c.dom.Attr; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; public class Main { /** The namespaceURI represented by the prefix <code>xmlns</code>. */ public static final String NS_URI_XMLNS = "http://www.w3.org/2000/xmlns/"; /** * This method traverses the DOM and grabs namespace declarations * on parent elements with the intent of preserving them for children. <em>Note * that the DOM level 3 document method {@link Element#getAttribute(java.lang.String)} * is not desirable in this case, as it does not respect namespace prefix * bindings that may affect attribute values. (Namespaces in DOM are * uncategorically a mess, especially in the context of XML Schema.)</em> * @param el the starting element * @return a {@link Map} containing prefix bindings. */ public static Map<String, String> getParentNamespaces(Element el) { HashMap<String, String> pref = new HashMap<String, String>(); Map<String, String> mine = getMyNamespaces(el); Node n = el.getParentNode(); while (n != null && n.getNodeType() != Node.DOCUMENT_NODE) { if (n instanceof Element) { Element l = (Element) n; NamedNodeMap nnm = l.getAttributes(); int len = nnm.getLength(); for (int i = 0; i < len; ++i) { Attr a = (Attr) nnm.item(i); if (isNSAttribute(a)) { String key = getNSPrefixFromNSAttr(a); String uri = a.getValue(); // prefer prefix bindings that are lower down in the tree. if (pref.containsKey(key) || mine.containsKey(key)) continue; pref.put(key, uri); } } } n = n.getParentNode(); } return pref; } public static Map<String, String> getMyNamespaces(Element el) { HashMap<String, String> mine = new HashMap<String, String>(); NamedNodeMap nnm = el.getAttributes(); int len = nnm.getLength(); for (int i = 0; i < len; ++i) { Attr a = (Attr) nnm.item(i); if (isNSAttribute(a)) { mine.put(getNSPrefixFromNSAttr(a), a.getValue()); } } return mine; } /** * Test whether an attribute contains a namespace declaration. * @param a an {@link Attr} to test. * @return <code>true</code> if the {@link Attr} is a namespace declaration */ public static boolean isNSAttribute(Attr a) { assert a != null; String s = a.getNamespaceURI(); return (s != null && s.equals(NS_URI_XMLNS)); } /** * Fetch the non-null namespace prefix from a {@link Attr} that declares * a namespace. (The DOM APIs will return <code>null</code> for a non-prefixed * declaration. * @param a the {@link Attr} with the declaration (must be non-<code>null</code). * @return the namespace prefix or <code>""</code> if none was * declared, e.g., <code>xmlns="foo"</code>. */ public static String getNSPrefixFromNSAttr(Attr a) { assert a != null; assert isNSAttribute(a); if (a.getPrefix() == null) { return ""; } return a.getName().substring(a.getPrefix().length() + 1); } }