java - 获取 XML 文档中使用的前缀/命名空间绑定(bind),最好使用 org.w3c.dom 和 javax.xml API

标签 java xml xml-namespaces xml-binding

有没有办法获取 XML 文档中使用的前缀/命名空间绑定(bind),最好使用标准 org.w3c.orgjavax.xml蜜蜂?据我所知,前缀可能会在包含的元素中重新定义,因此 API 也应该能够考虑到这一点。

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

最佳答案

这是一个开始,使用 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();
}

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

我想此方法的任何进一步改进取决于您的用例,例如您还需要哪些信息来使重新定义的绑定(bind)变得有意义?

关于java - 获取 XML 文档中使用的前缀/命名空间绑定(bind),最好使用 org.w3c.dom 和 javax.xml API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18382375/

相关文章:

java - 用于在 SOA 环境中实现请求-响应类型应用程序的框架/协议(protocol)/工具

javascript - 如何使用 jQuery 'find' 避免在带有命名空间的 xml 中使用相同标记的多个节点?

PHP DOMDocument 获取标签的属性

java - 带有用户名和密码输入的 JOptionPane

java - 从 EJB 创建文本文件,无需 java.io

c# - XmlDocument.GetElementById() 返回 null

sql - 如何在 MS SQL 2005 中使用 SQL XQuery 修改多个节点

xml - xslt - 引用上一个模板的输出结果

java - 如何使用 XOM 仅在第一个标签上设置命名空间?

java - CXF 客户端 : unable to find valid certification path to requested target