Dom4j xmlns属性

Pho*_*nix 3 java dom4j

我想仅将xmlns属性添加到根节点,但是当我向根元素添加命名空间时,所有后续子元素也会获得相同的xmlns属性.如何将xmlns属性添加到单个节点但不添加任何子节点?码:

public String toXml() {

        Document document = DocumentHelper.createDocument();
        Element documentRoot = document.addElement("ResponseMessage");
        documentRoot.addNamespace("",getXmlNamespace())
                .addAttribute("xmlns:xsi", getXmlNamespaceSchemaInstance())
                .addAttribute("xsi:schemaLocation", getXmlSchemaLocation())
                .addAttribute("id", super.getId());

        Element header = documentRoot.addElement("Header");
        buildHeader(header);

        Element body = documentRoot.addElement("Body");
        buildProperties(body);

        body.addElement("StatusMessage").addText(this.getStatusMessage().getMessage());

        return document.asXML();


    }
Run Code Online (Sandbox Code Playgroud)

for*_*two 5

好的,新答案.

如果希望元素属于某个命名空间,请确保在该命名空间中创建它们.使用具有Qname其参数之一的方法.如果您创建一个没有命名空间的元素,DOM4J将不得不添加命名空间声明以适应您的(不情愿的)规范.

您的示例略有编辑.我没有使用QName,但给每个元素命名空间uri:

public static String toXml() {

    Document document = DocumentHelper.createDocument();
    Element documentRoot = document.addElement("ResponseMessage",
            getXmlNamespace());
    documentRoot.addAttribute(QName.get("schemaLocation", "xsi", "xsi-ns"),
            "schema.xsd").addAttribute("id", "4711");

    Element header = documentRoot.addElement("Header");

    Element body = documentRoot.addElement("Body", getXmlNamespace());
    // buildProperties(body);

    body.addElement("StatusMessage", getXmlNamespace()).addText("status");

    return document.asXML();

}

private static String getXmlNamespace() {
    return "xyzzy";
}

public static void main(String[] args) throws Exception {

    System.out.println(toXml());
}
Run Code Online (Sandbox Code Playgroud)

产生输出:

<?xml version="1.0" encoding="UTF-8"?>
<ResponseMessage xmlns="xyzzy" xmlns:xsi="xsi-ns" xsi:schemaLocation="schema.xsd" id="4711">
<Header/><Body><StatusMessage>status</StatusMessage></Body>
</ResponseMessage>
Run Code Online (Sandbox Code Playgroud)

更新2:

另请注意,我改变了schemaLocation声明属性的方式.您真的永远不必手动管理命名空间声明 - 这将由库来处理.

但是,有一种情况是添加名称空间延迟可能有用:如果您有一个主要包含名称空间X元素的文档,并且在文档中展开了一些带有namspace Y的子元素,则在根目录中声明了一个名称绑定Y element,可以在子元素中保存大量重复的名称空间声明.