【问题标题】:normalizing XML namespaces in a DOM document in Java?在 Java 中规范化 DOM 文档中的 XML 命名空间?
【发布时间】:2012-05-11 14:25:54
【问题描述】:

我想知道是否有一种直接的方法可以在表示为 Java 中的 DOM 文档的 XML 文档中“规范化”XML 命名空间定义?

我需要它的原因是能够比较两个文档,它们都使用 XML 命名空间。

由于 XML 命名空间可以在文档中的任何位置(在根元素中,在任何元素中)等处指定,因此从 DOM 树的角度来看,实际上相同的两个文档可能会有很大的不同。例如,一个可以在根元素中定义所有命名空间属性,而另一个可以在命名空间适用的 DOM 树层次结构中的“最高”元素中定义每个命名空间。本质上,这些可以是相同的文档,但是在比较它们时,比如使用 XmlUnit,就会出现比较问题。

举两个例子:

<root xmlns:foo="http://foo/">
    <e1>
        <foo:e2>bar</foo:e2>
    </e1>
</root>

对比:

<root>
    <e1 xmlns:foo="http://foo/">
        <foo:e2>bar</foo:e2>
    </e1>
</root>

这些文档实际上是相同的,但是通过 XML 比较会发现它们不同。

我想知道是否有一种直接/简单的方法来规范命名空间定义,例如,将它们全部放在根元素中?

当然可以自己编写这样的代码,但如果已经可以使用,那就更好了:)

【问题讨论】:

    标签: java xml dom xml-namespaces


    【解决方案1】:

    XOM API 有一个 Canonicalizer 就是为了这个目的。它不是标准的 W3C DOM API,但也许它可以满足您的需求。

    【讨论】:

    • apache xmlsec 项目也有一个santuario.apache.org/Java/api/org/apache/xml/security/c14n/…,它可以与 w3c DOM api 一起使用。
    • jtalhborn,感谢您的提示。不幸的是,在我的例子中,apache XML 安全规范化器不会产生规范的输出。我的一般问题是命名空间声明,例如:&lt;root xmlns:foo="http://foo/"&gt;&lt;e1&gt;&lt;foo:e2&gt;bar&lt;/foo:e2&gt;&lt;/e1&gt;&lt;/root&gt;&lt;root&gt;&lt;e1 xmlns:foo="http://foo/"&gt;&lt;foo:e2&gt;bar&lt;/foo:e2&gt;&lt;/e1&gt;&lt;/root&gt; 在这种情况下,规范形式的 XML 是不一样的,即使文档是有效的。
    • skaffman,我也检查了 XOM API,得到了相同的结果。基本上 XML 命名空间声明的位置不是“规范化的”,因此在“简单”XML 比较中这些将被认为是不同的。我在主文章中放了一个例子来演示这个问题
    • @ÁkosMaróy:你找到解决办法了吗?
    • @HaseebKhan nope :(
    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2015-11-05
    • 2014-09-17
    • 2010-10-06
    • 1970-01-01
    • 2010-10-22
    • 2011-03-30
    相关资源
    最近更新 更多