javascript - 使用 javascript 避免在 xml 序列化期间重复命名空间

标签 javascript xml dom

以下代码

var ns1 = 'hello:world1',
    doc = document.implementation.createDocument('nsdoc', 'doc', null),
    outer = doc.createElement('outer'),
    s = new XMLSerializer(),
    elm;

outer.setAttribute('xmlns:ns1', ns1);
elm = doc.createElementNS(ns1, 'Inner');

outer.appendChild(elm);

console.log(s.serializeToString(outer));

在 chrome 和 firefox 中输出以下 xml 文档。

<outer xmlns:ns1="hello:world1">
  <Inner xmlns="hello:world1"/>
</outer>

虽然这在技术上仍然有效,但有没有办法删除重复的 ns 声明,或者是否有更好的 api 可用于在父节点上设置命名空间以供子节点使用?例如,文档最好如下所示:

<outer xmlns:ns1="hello:world1">
  <ns1:Inner/>
</outer>

最佳答案

弄清楚如何通过使用 DOMParser 和一些不舒服的手写 XML(但仅限于根节点)来更好地控制命名空间的序列化方式。以下 JavaScript 执行此操作:

var parser = new DOMParser(),
    s = new XMLSerializer(),
    dom1 = parser.parseFromString('<doc xmlns="one"></doc>', 'text/xml'),
    dom2 = parser.parseFromString('<outer xmlns="one" xmlns:ns3="hello-world"></outer>', 'text/xml'),
    myElm = dom2.createElementNS('hello-world', 'ns3:Inner');

dom2.documentElement.appendChild(myElm);
dom2.documentElement.attributes.removeNamedItem('xmlns');
dom1.documentElement.appendChild(dom2.documentElement);
console.log(s.serializeToString(dom1));

这会在 Chrome(Mac 上为 26.0)、Firefox(Mac 上为 21.0)和 Opera(Mac 上为 12.15 - 尽管 Opera 还包含 xml 声明,这可以满足我的需求)中输出以下 xml

<doc xmlns="one">
  <outer xmlns:ns3="hello-world">
    <ns3:Inner/>
  </outer>
</doc>

关于javascript - 使用 javascript 避免在 xml 序列化期间重复命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16678020/

相关文章:

javascript - 阻止区域并且不允许鼠标影响它

javascript - 检查 JS 对象类型的最准确方法?

JavaScript 对数组进行过滤和减少以连接字符串

javascript - 如何在不传递事件参数的情况下获取触发 "onclick"事件的元素?

javascript - 提高jQuery代码性能的方法【选择器 Angular 】

javascript - AngularJS - 从 Controller 获取模块常量

xml - 我可以在同一个 XML 文件中使用 xinclude 和实体吗?

java - 使用默认命名空间时无法解码编码文档

xml - 比较Xpath中不同节点的值

javascript - 添加 .animation 更改链接标记内跨度的背景颜色不起作用