gpt4 book ai didi

java - 阻止 JDOM2 创建 xmlns =""

转载 作者:行者123 更新时间:2023-12-01 18:24:26 25 4
gpt4 key购买 nike

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

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

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

如何防止这种情况发生?

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

最佳答案

如果您将子元素添加到命名空间中已有的其他元素,JDOM 只会添加 xmlns=""。 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>

在上面的示例中,默认命名空间从“”更改为 http://mynamespace,因此现在没有前缀的元素位于该默认命名空间 http://我的命名空间。重申一下,以下两个文档是相同的:

<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 (Namespace.NO_NAMESPACE)。请参阅此处的 JDOM 文档:new Element(String name) .

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

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

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

资源:

关于java - 阻止 JDOM2 创建 xmlns ="",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26674924/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com