向根节点添加命名空间会导致它添加命名空间以添加子节点

时间:2013-03-11 16:48:10

标签: java dom4j

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也被添加到头部和主体节点。我如何只将xmlns添加到根节点,即loadEvent?

1 个答案:

答案 0 :(得分:1)

是的,这可能令人困惑。当文档表示为元素树和其他节点类型时,每个元素都属于特定的命名空间,独立于任何其他元素节点,甚至是其祖先。对于所有面向XML节点的“主要”API(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中,元素节点不继承其父节点的名称空间。必须使用适当的命名空间创建每个元素(如果有的话)。