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?
答案 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中,元素节点不继承其父节点的名称空间。必须使用适当的命名空间创建每个元素(如果有的话)。