获取XML文档中使用的前缀/名称空间绑定,最好使用org.w3.dom和javax.xmlAPI



有没有一种方法可以获得XML文档中使用的前缀/命名空间绑定,最好使用标准的org.w3c.orgjavax.xml API?我知道前缀可能在包含的元素中被重新定义,所以API也应该能够解释这一点。

我正在寻找一个代码剪辑,它将采用某种序列化形式的XML文档,并返回前缀到URI名称绑定的Map<String, String>(加上API中的一些额外聪明,以考虑在封闭元素中的重新定义)。理想情况下,库可能能够做一些更高级的事情,例如识别/清除未使用的绑定,将重复的绑定移动到它们最近的共同祖先(而不是让它们到处复制)等等

以下是使用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();
}

这将只获取有效的绑定,并且不会绑定任何默认名称空间(当然可以修复)。绑定的重新定义将按文档顺序表示,但不会按它们发生的深度表示。

我想这个方法的任何进一步改进都取决于您的用例,例如,您还需要哪些信息来使重新定义的绑定变得合理?

最新更新