1
String retVal = null;
Document document = DocumentHelper.createDocument();
Element documentRoot = document.addElement(LOAD_EVENT);
Element header = documentRoot.addElement(HEADER);
Element body = documentRoot.addElement(DOCUMENTS);
Namespace namespace =
new Namespace("", "http://www.acme.com/LoadEvent");
documentRoot.add(namespace);

这导致 xmlns 也被添加到 header 和 body 节点。如何只将 xmlns 添加到 loadEvent 的根节点?

4

1 回答 1

1

是的,这可能会令人困惑。当文档表示为元素树和其他节点类型时,每个元素都属于一个特定的命名空间,独立于任何其他元素节点,甚至与其祖先。这适用于所有“主要的”面向 XML 节点的 API:s(DOM、JDOM、DOM4J 和 XOM)。

由于您将 LOAD_EVENT 元素创建为没有命名空间,但后来向节点添加了默认命名空间声明,DOM4J 没有选择,只能更改 LOAD_EVENT 的命名空间(这是 DOM4J 允许非常混乱的操作的地方,恕我直言)。但是,子节点仍然没有命名空间(或空命名空间)。

当您稍后将树序列化为 XML 时,在根节点声明的默认命名空间必须为每个子节点“未声明”。

我的猜测是你想要这样的东西:

    String NS = "http://www.acme.com/LoadEvent";
    Document document = DocumentHelper.createDocument();
    Element documentRoot = document.addElement("load", NS);
    Element header = documentRoot.addElement("header", NS);
    Element body = documentRoot.addElement("documents", NS);

也就是说,每个元素都属于 NS 命名空间。

换句话说:在面向树的 API:s 中,元素节点不继承其父节点的命名空间。每个元素都必须使用正确的命名空间(如果有的话)创建。

于 2013-03-15T01:57:33.777 回答