我尝试<class>
使用 JDOM2 将新元素添加到 persistence.xml 文件中。
persistenceUnitEl.add(new Element("class").addContent(className));
问题是 jdom2 总是添加xmlns=""
到<class>
元素中。
我怎样才能防止这种情况?
removeAttribute("xmlns")
不起作用,removeNameSpace(el.getNameSpace())
也不起作用。
xmlns=""
如果您将子元素添加到已经在命名空间中的其他元素,JDOM 只会添加。XML 中的默认命名空间是没有前缀的命名空间。在以下示例中:
<root>
<child />
</root>
没有命名空间前缀,默认命名空间是“”。
上面的 XML 片段在语义上等同于:
<root xmlns="" >
<child />
</root>
这xmlns=""
意味着,任何时候你看到一个没有前缀的元素,你都应该把它放在“空”命名空间“”中。
现在,如果你想把东西放在一个命名空间中,并有一个前缀,你会这样做:
<ns:root xmlns:ns="http://mynamespace">
<ns:child />
</ns:root>
请注意,上面示例中的根元素和子元素位于命名空间中http://mynamespace
,并且该命名空间具有前缀ns
。上面的代码在语义上等同于(具有相同的含义):
<root xmlns="http://mynamespace">
<child />
</root>
在上面的示例中,默认命名空间从 "" 更改为 be http://mynamespace
,因此现在没有前缀的元素位于该默认命名空间http://mynamespace
中。重申一下,以下两个文件是相同的:
<ns:root xmlns:ns="http://mynamespace">
<ns:child />
</ns:root>
和
<root xmlns="http://mynamespace">
<child />
</root>
现在,所有这些与您的问题有什么关系?
好吧,您的元素persistenceUnitEl
必须位于不是“”的默认命名空间中。在那个元素的某个地方,或者它的父元素上,你有类似的东西:
<tagname xmlns="...something....">
<PersistenceUnit>
</PersistenceUnit>
</tagname>
在上面,PersistenceUnit
是在命名空间中...something....
。现在,您要求 JDOM 将元素添加new Element("class")
到文档中,因此您得到:
<tagname xmlns="...something....">
<PersistenceUnit>
<class xmlns="" />
</PersistenceUnit>
</tagname>
原因是因为您告诉 JDOM 将其放在“”命名空间 (Namespace.NO_NAMESPACE) 中。请在此处查看 JDOM 的文档:new Element(String name)
.
相反,您想要做的是将其放在与父级相同的命名空间中:
Namespace parentNamespace = persistenceUnitEl.getNamespace();
persistenceUnitEl.add(new Element("class", parentNamespace).addContent(className));
现在,真正的问题是“类”元素是否实际上属于与父元素相同的命名空间。但这是一个只有你能回答的问题。
资源:
根据我的理解,我认为这就是你想要的。
<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);
}