具有xmlns的元素与使用相同namespaceURI的createElementNS创建的元素有何不同



假设我们有以下XML:

<ns:xml xmlns:ns="AAA">
<predefined xmlns="AAA"/>
</ns:xml>

在浏览器中运行以下代码时:

const doc = new DOMParser().parseFromString(XML, 'text/xml');
const added = doc.createElementNS('AAA', 'added');
doc.documentElement.appendChild(added);

仅序列化added返回<added xmlns="AAA"/>但是当串行化doc时,结果是

<ns:xml xmlns:ns="AAA">
<predefined xmlns="AAA"/>
<a:added />
</ns:xml>

为什么predefinedadded表现不同?或者反过来问:如何使用createElementNS(和其他DOMAPI(创建像predefined这样的元素?

要使added的行为与predefined类似,需要将xmlns属性显式设置为与namespaceURI参数相同的命名空间:

const added = doc.createElementNS('AAA', 'added');
added.setAttribute('xmlns', 'AAA');
doc.documentElement.appendChild(added);

还要注意,使用mime类型text/html解析它会改变(解析和(序列化的行为,从而导致以下结果:

<ns:xml xmlns:ns="AAA">
<predefined xmlns="AAA"></predefined>
<added xmlns="AAA"></added>
</ns:xml>

最新更新