0

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

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

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

我怎样才能防止这种情况?

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

4

2 回答 2

4

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));

现在,真正的问题是“类”元素是否实际上属于与父元素相同的命名空间。但这是一个只有你能回答的问题。

资源

于 2014-10-31T14:41:46.713 回答
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);
} 
于 2015-08-14T06:41:19.327 回答