添加空的默认 XML 命名空间 xmlns="" 属性?
Posted
技术标签:
【中文标题】添加空的默认 XML 命名空间 xmlns="" 属性?【英文标题】:Empty default XML namespace xmlns="" attribute being added? 【发布时间】:2018-08-25 16:01:06 【问题描述】:我有简单的代码,我在其中创建根元素并将子元素附加到它。问题是 child 附加了空的 xmlns=""
属性,尽管我不期望它。这只是第一个孩子的问题,第二个嵌套级别的孩子已经可以了。
所以,下面的代码 -
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element rootEl = doc.createElementNS("http://someNamespace.ru", "metamodel");
doc.appendChild(rootEl);
Element groupsEl = doc.createElement("groups");
// This appends with xmlns=""
rootEl.appendChild(groupsEl);
Element groupEl = doc.createElement("group");
// This appends normally
groupsEl.appendChild(groupEl);
将结果输出 -
<?xml version="1.0" encoding="UTF-8"?>
<metamodel xmlns="http://someNamespace.ru">
<groups xmlns="">
<group/>
</groups>
</metamodel>
而不是-
<?xml version="1.0" encoding="UTF-8"?>
<metamodel xmlns="http://someNamespace.ru">
<groups>
<group/>
</groups>
</metamodel>
注意,正如我上面所说,标签<group>
已经从xmlns
中释放出来。
【问题讨论】:
【参考方案1】:您想要的标记显示默认命名空间中的所有元素。为了实现这一点,您必须在默认命名空间中创建所有元素。
您得到的实际输出是 <groups xmlns="">
,因为 groups
及其 group
子元素是在没有命名空间中创建的:
Element groupsEl = doc.createElement("groups");
把这个改成
Element groupsEl = doc.createElementNS("http://someNamespace.ru", "groups");
同样,改变
Element groupEl = doc.createElement("group");
到
Element groupEl = doc.createElementNS("http://someNamespace.ru","group");
【讨论】:
谢谢医生,这对我有帮助 :) 不过,这对我来说似乎有点奇怪,您每次都必须明确设置它,尽管它可以被继承。 您的想法是可以理解的,特别是考虑到在 XML 中,后代元素默认情况下会继承在层次结构中较高的元素上所做的命名空间声明。然而,这是一种词法作用域;更多地将其视为创建,并且创建调用希望被赋予命名空间,或者它默认为无命名空间。以上是关于添加空的默认 XML 命名空间 xmlns="" 属性?的主要内容,如果未能解决你的问题,请参考以下文章