这是一个开始,使用Guava MultiMap:
Document doc = ...;
Multimap<String, String> bindings = LinkedHashMultimap.create();
DocumentTraversal dt = (DocumentTraversal) doc;
NodeIterator i = dt.createNodeIterator(doc, NodeFilter.SHOW_ELEMENT,
null, false);
Element element = (Element) i.nextNode();
while (element != null) {
String prefix = element.getPrefix();
if (prefix != null) {
String uri = element.getNamespaceURI();
bindings.put(prefix, uri);
}
element = (Element) i.nextNode();
}
这只会获取有效的绑定,并且不会绑定任何默认命名空间(当然可以修复)。绑定的重新定义将按文档顺序表示,但不按它们发生的深度表示。
我想这种方法的任何进一步改进取决于您的用例,例如,您需要更多信息来使重新定义的绑定变得有意义?