2013-05-21 209 views
1

以下代码避免使用javascript

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)); 

复制XML序列化过程中的命名空间输出在铬和Firefox下面的XML文档。

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

尽管这在技术上仍然有效,有没有办法删除重复NS声明或是否有更好的API是用来设置命名空间用于儿童的父节点上?例如,将优选的文件如下所示:

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

最坏的情况:s.serializeToString(外).split( '的xmlns = “你好:world1”')加入( '') – dandavis

+0

@dandavis是不会工作的,节点将被丢失。 'ns1:'前缀,表示该节点的不同名称空间。 –

+0

如果两者都使用ns1,则不需要将内部标记命名为空间。另外,你不能像这样设置一个命名空间的内部attrib,为此使用setAttributeNS和createElementNS。 – dandavis

回答

0

想出如何获得对如何命名空间通过使用的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以下XML(26.0在Mac),火狐(21.0在Mac)和Opera(12.15 Mac上 - 尽管Opera还包括XML声明这是确定的我的需求)

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