有没有办法获得XML文档中使用的前缀/名称空间绑定,最好使用标准的org.w3c.org
和javax.xml
API?我知道前缀可以在包含的元素中重新定义,因此API也应该能够解释这一点。
我正在寻找一个代码剪切,它会以某种序列化形式获取XML文档,并向URI名称绑定返回Map<String, String>
前缀(加上API中的一些额外的聪明,以解释封闭元素中的重新定义) 。理想情况下,库可能能够做更好的东西,例如识别/清除未使用的绑定,将重复绑定移动到最近的共同祖先(而不是让它们在整个地方复制)等等。
答案 0 :(得分:1)
这是一个开始,使用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();
}
这只会获取有效的绑定,并且它不会绑定任何默认命名空间(当然可以修复)。绑定的重新定义将按文档顺序表示,但不是它们发生的深度。
我想这种方法的任何进一步改进都取决于你的用例,例如:您还需要提供哪些更多信息才能使重新定义的绑定变得明智?