添加限定的XML元素不会inheritance名称空间URI
我怎样才能将一个带有ns前缀的元素附加到另一个元素,并使其inheritance文档中的namespaceURI映射?
例如:实例化parsingXMLstring的文档: pp:q
元素从root
元素inheritancenamespaceURI == 'abc'
,但将新元素pp:q
附加到root
,新元素具有namespaceURI == null
doc = new DOMParser().parseFromString( '<root xmlns:pp="abc">' +'<pp:q/>' +'<q/>' +'</root>' ,'text/xml'); root = doc.firstChild; x = root.getElementsByTagName("pp:q").item(0); console.log(x.namespaceURI); // logs abc y = doc.createElement('pp:q') root.appendChild(y) console.log(y.namespaceURI); //logs null
这个例子使用xmldom
库在nodejs
中xmldom
[下面回复kjhughes]
我也尝试了createElementNS
,但是我觉得这种方式也有问题。
将这些行附加到代码中:
a = doc.createElementNS('abc', 'pp:q'); root.appendChild(a) console.log(a.namespaceURI); //abc --- i may say it works, //even though i'm required using //both prefix *and* namespaceURI manually //while for the parsed element (x) //a lookup has been succesfully issued // but ... a1 = doc.createElementNS('abc', 'xx:q'); root.appendChild(a1) console.log(a1.namespaceURI); //abc --- but prefix is xx! not according to xmlns declaration! b = doc.createElementNS('xyz', 'VV:q'); root.appendChild(b) console.log(b.namespaceURI); //xyz --- I can write anything! console.log(String(doc)); //<root xmlns:pp="abc"><pp:q/><q/><pp:q/><xx:q/><VV:q/></root>
根据document.createElement()的文档 ,
var element = document.createElement(tagName);
元素是创build的元素对象。
tagName是一个string,指定要创build的元素的types。 创build的元素的nodeName用tagName的值进行初始化。 不要使用限定名称(如“html:a”) 。
你应该改用document.createElementNS() 。
每个问题更新更新:
请注意,名称空间本身是重要的,而不是名称空间前缀。 当您为给定名称空间提供多个前缀时,API的部分没有义务使用特定的名称空间前缀。 而且,认识到.namespaceURI
是命名空间 , 而不是 命名空间前缀 。
你会感到困惑,因为你使用console.log(String(doc));
输出XML。 使用XML序列化器: console.log((new XMLSerializer()).serializeToString(doc));
还有其他要注意的地方
- 创build具有名称空间URI(带或不带前缀)的元素时,始终使用
createElementNS()
)。 - 名称空间前缀无关紧要。 重要的是命名空间URI和相应的命名空间定义(将URI绑定到前缀或使命名空间成为默认名称空间)。
- 如果任何元素或属性使用某个前缀,则必须将前缀绑定到名称空间URI。 否则,文档将是(名称空间)无效。
- 不要使用mimetype
text/xml
,这将导致严重的编码问题,并被弃用。 使用application/xml
– 或者在这种情况下使用application/xhtml+xml
– 来代替。