setNamespaceAware(true)有什么缺点吗?

时间:2018-04-12 07:08:37

标签: java dom xml-namespaces jaxp

我使用以下代码在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有什么好处?

1 个答案:

答案 0 :(得分:3)

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

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