setNamespaceAware(true) 有什么缺点吗?

Are there any disadvantages to setNamespaceAware(true)?

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

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Element el = db.parse(file).getDocumentElement();

但是,在解析使用名称空间的 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)

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

dbf.setNamespaceAware(true);

现在一切正常。

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

但是,如果是这样的话,那他们为什么选择它,为什么默认 false

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

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

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