微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决具有 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 的行为不同? 或者反过来问: 我如何能够使用 predefined(和其他 DOM API)创建像 createElementNS 这样的元素?

解决方法

要使 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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。