我尝试使用JDOM2将新的<class>
元素添加到persistence.xml文件中。
persistenceUnitEl.add(new Element("class").addContent(className));
问题是jdom2总是将xmlns=""
添加到<class>
元素。
我该如何防止这种情况?
removeAttribute("xmlns")
不起作用,removeNameSpace(el.getNameSpace())
也不起作用。
答案 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);
}