Java+DOM:如何将没有命名空间的 DOM 树转换为可感知命名空间的 DOM 树?

Posted

技术标签:

【中文标题】Java+DOM:如何将没有命名空间的 DOM 树转换为可感知命名空间的 DOM 树?【英文标题】:Java+DOM: How do I convert a DOM tree without namespaces to a namespace-aware DOM tree? 【发布时间】:2011-02-28 04:55:51 【问题描述】:

我从某个 API(不在 JDK 中)收到 Document(DOM 树)。可悲的是,这个Document 不支持命名空间。据我所知,DOM一旦生成,之后就不能“添加”命名空间感知。

当使用 Transformer 将此文档转换为字符串时,XML 是正确的。元素具有xmlns:... 属性和名称前缀。但从 DOM 的角度来看,没有命名空间,也没有前缀。

我需要能够将这个Document 转换成一个新的Document,它 命名空间感知的。是的,我可以通过将其转换为字符串并返回启用命名空间的 DOM 来做到这一点。

但是:原始树的节点设置了用户对象。转换为字符串并返回将使这些用户对象到新的Document 的映射非常复杂,如果不是不可能的话。所以我真的需要一种将非命名空间 DOM 转换为命名空间 DOM 的方法。

对此有或多或少直接的解决方案吗?

最坏的情况(我希望避免的)是手动遍历旧的Document 树并为每个旧的Node 创建新的命名空间感知Node。这样做,必须手动“解析”命名空间前缀,注意xmlns-attributes,并维护前缀和命名空间-URI 之间的映射。很多事情都会出错。

【问题讨论】:

你有没有在这方面取得任何进一步的进展?我也有类似的情况。 【参考方案1】:

我想你发现没有简单的方法可以做到这一点。如果您有一个认为 xmlns:foo="xxx" 是属性而不是名称空间声明的旧式 DOM,则无法神奇地“升级”它。您必须序列化/重新序列化或手动遍历树并自己转换这些属性。

【讨论】:

以上是关于Java+DOM:如何将没有命名空间的 DOM 树转换为可感知命名空间的 DOM 树?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 java dom 从 xml 中删除命名空间?

在 Java DOM 中创建以命名空间为前缀的 XML 节点

使用 DOM 解析器在 Java 中解析具有 2 个默认命名空间的 XML

当我将 jquery dom 操作方法放入命名空间时,“this”没有按预期解决?

将“DOM Waiter”转换为命名空间监听器?

vue渲染虚拟dom树原理