防止JDOM2创建xmlns =""

时间:2014-10-31 12:38:50

标签: java jdom jdom-2

我尝试使用JDOM2将新的<class>元素添加到persistence.xml文件中。

persistenceUnitEl.add(new Element("class").addContent(className));

问题是jdom2总是将xmlns=""添加到<class>元素。

我该如何防止这种情况?

removeAttribute("xmlns")不起作用,removeNameSpace(el.getNameSpace())也不起作用。

2 个答案:

答案 0 :(得分:4)

如果将子元素添加到已在命名空间中的其他元素,则JDOM仅添加xmlns=""。 XML中的默认命名空间是没有前缀的命名空间。在以下示例中:

<root>
    <child />
</root>

没有名称空间前缀,默认名称空间为&#34;&#34;。

上述XML代码段在语义上与:

相同
<root xmlns="" >
    <child />
</root>

xmlns=""表示,只要您看到没有前缀的元素,就应该将其放入“空白”字样中。命名空间&#34;&#34;。

现在,如果你想把东西放在命名空间中,并且有一个前缀,你可以这样做:

<ns:root xmlns:ns="http://mynamespace">
    <ns:child />
</ns:root>

请注意,上例中的根元素和子元素位于命名空间http://mynamespace中,该命名空间的前缀为ns。上面的代码在语义上与(具有相同的含义)相同:

<root xmlns="http://mynamespace">
    <child />
</root>

在上面的示例中,默认命名空间从&#34;&#34;更改为http://mynamespace,所以现在没有前缀的元素位于该默认命名空间http://mynamespace中。重申一下,以下两个文件是相同的:

<ns:root xmlns:ns="http://mynamespace">
    <ns:child />
</ns:root>

<root xmlns="http://mynamespace">
    <child />
</root>

现在,所有这些与您的问题有什么关系?

嗯,您的元素persistenceUnitEl必须位于不是&#34;&#34;的默认命名空间中。在那个元素的某个地方,或者在它的父母身上,你有类似的东西:

<tagname xmlns="...something....">
    <PersistenceUnit>
    </PersistenceUnit>
</tagname>

在上文中,PersistenceUnit位于命名空间...something....中。现在,您要求JDOM将元素new Element("class")添加到文档中,以便获得:

<tagname xmlns="...something....">
    <PersistenceUnit>
        <class xmlns="" />
    </PersistenceUnit>
</tagname>

原因是因为你告诉JDOM把它放在&#34;&#34; namespace(Namespace.NO_NAMESPACE)。请在此处查看JDOM的文档:new Element(String name)

相反,您想要做的是将它放在与父级相同的命名空间中:

Namespace parentNamespace = persistenceUnitEl.getNamespace();
persistenceUnitEl.add(new Element("class", parentNamespace).addContent(className));

现在,真正的问题是&#34;类&#34; element实际上与父级属于同一名称空间。但这是一个只有你能回答的问题。

<强>资源

答案 1 :(得分:0)

根据我的理解,我认为这就是你想要的。

<RootTagname xmlns="...some namespace....">
    <SubTag>
        <NewElement yourAttrib="1"/>
    </SubTag> 
</RootTagname >

这就是你得到的。

<RootTagname xmlns="...some namespace....">
    <SubTag>
        <NewElement xmlns="" yourAttrib="1"/>
    </SubTag> 
</RootTagname >

使用以下代码段创建新元素

Element newElement = new Element("NewElement", subElement.getNamespace());

这是完整的代码。

Namespace namespace = Namespace.getNamespace("prefix", ".....some namespace....");
XPathBuilder<Element> subTagXpathelementBuilder = new XPathBuilder<Element>("//prefix:SubTag", Filters.element());
subTagXpathelementBuilder.setNamespace(namespace);
XPathFactory xpathFactory = XPathFactory.instance();

Document doc = (Document) builder.build(xmlFile);

XPathExpression<Element> xpath = subTagXpathelementBuilder .compileWith(xpathFactory);
List<Element> subElementsList = xpath.evaluate(doc);
for (Element subElement : subElementsList ) {
    Element newElement = new Element("NewElement", subElement.getNamespace());

    List<Attribute> newElementAttribList = newElement.getAttributes();
    newElementAttribList .add(new Attribute("yourAttrib", "1"));
    subElement .addContent(newElement);
}