如何使用 dom4j 添加默认名称 space?

How to add a default name space with dom4j?

我想使用 dom4j 将默认名称 space 添加到 XML 文档的根元素,如以下代码片段所示。使用 dom4j 执行此操作的正确方法是什么?

<?xml version="1.0" encoding="utf-8" ?>
<animals xmlns="http://zoo.domain.org/schema/animals" >
    <animal id="1">
        <elephant>
            <name>Jumbo</name>
        </elephant>
    </animal>
</animals>

dom4j API 确实提供了方法 Element#addNamespace 但 javadoc 指出前缀不能为空。 不过,以下代码将为 animals 生成预期的名称 space:

Document document = DocumentHelper.createDocument();
Element animals = document.addElement("animals")
        .addNamespace("", "http://zoo.domain.org/schema/animals");
Element animal = animals.addElement("animal")
        .addAttribute("id", "1");
animal.addElement("elephant")
        .addElement("name")
        .addText("Jumbo");

// write document to file etc.
...

... 但是子元素 animal 得到一个空字符串作为默认名称space,这不是我想要的:

<?xml version="1.0" encoding="UTF-8"?>
<animals xmlns="http://zoo.domain.org/schema/animals">
    <animal xmlns="" id="1">
        <elephant>
            <name>Jumbo</name>
        </elephant>
    </animal>
</animals>

您没有创建文档(根)元素。

Document document = DocumentHelper.createDocument();
Element root = document.addElement( "animals" );
// TODO the rest of your code

最终,您会将文档传递给 XML 作者来编写(保存)文档。此外,来自 Javadoc:

Element addNamespace​(java.lang.String prefix, java.lang.String uri) Adds a namespace to this element for use by its child content Parameters: prefix - is the prefix to use, which should not be null or blank

您可以尝试的一件事是创建一个 Namespace 的实例,将空字符串传递给构造函数并改用 Element.add() 方法。 Namespace的Javadoc没有说明前缀不能为空

方法 Document#addElement(还有 Element#addElement)接受第二个参数 namespaceURI。这就是诀窍,将默认名称空间添加到 XML 元素。

以下代码将产生预期的 XML。

Document document = DocumentHelper.createDocument();
Element animals = document.addElement("animals", "http://zoo.domain.org/schema/animals");
Element animal = animals.addElement("animal")
        .addAttribute("id", "1");
animal.addElement("elephant")
        .addElement("name")
        .addText("Jumbo");

// write document to file etc.
...

另外值得一提的是,如果您想自己创建一个元素,DocumentFactory#createElement 有一个重载版本也可以接受 namespaceURIDocumentHelper#createElement没有这样的重载方法