setNamespaceAware(true) 有什么缺点吗?

Adr*_*ith 6 java dom jaxp xml-namespaces

我使用以下代码在 Java 中解析 XML 文档:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Element el = db.parse(file).getDocumentElement();
Run Code Online (Sandbox Code Playgroud)

但是,在解析使用名称空间的 XML 文档时,出现错误:

org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create
or change an object in a way which is incorrect with regard to namespaces.
        at org.apache.xerces.dom.ElementNSImpl.setName(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

我通过添加以下行解决了这个错误:

dbf.setNamespaceAware(true);
Run Code Online (Sandbox Code Playgroud)

现在一切正常。

在我看来,将解析器设置为命名空间感知将是一件完全积极的事情。据我所知,它仍然可以很好地处理“vanilla”非命名空间文档,没有任何缺点。

但是,如果是这样的话,那么他们为什么要把它作为一个选项,为什么false默认情况下呢?

所以我的问题是:我在我的软件中使用的一个好的默认设置是什么?我应该始终将其设置为true(因为这些 API 的设计者通过将其作为选项提供而搞砸了)还是应该false在某些情况下将其保留,因为每个值都有一些优点?如果是这样,它的优点是false什么?

Alo*_*hci 7

您不必使用解析创建文档。您可以通过 createDocument、createElement 等创建文档。在非命名空间感知的文档中,冒号是节点名称的有效字符,例如,您可以有一个 element <foo:bar:baz>

在引入 XML 名称空间之前用这些元素编写的代码可以正常工作。因此,为了向后兼容,当引入对命名空间的支持时,保持代码正常工作的唯一方法是默认情况下使命名空间感知为 false,因为<foo:bar:baz>在命名空间感知文档中是不合法的。