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

问题描述:

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

到目前为止的任何解决方案? – ronnyfm 2014-02-04 17:11:58

是的,这可能会造成混淆。当文档被表示为元素树和其他节点类型时,每个元素都属于特定的名称空间,与任何其他元素节点(甚至其祖先)无关。对于所有“主要”面向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中,元素节点不会继承其父级的名称空间。每个元素必须使用适当的名称空间创建,如果它有一个。

+0

谢谢,这也解决了我的问题。 – Gondy 2014-04-26 12:40:55