添加限定的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 库在nodejsxmldom

[下面回复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));

还有其他要注意的地方

  1. 创build具有名称空间URI(带或不带前缀)的元素时,始终使用createElementNS() )。
  2. 名称空间前缀无关紧要。 重要的是命名空间URI和相应的命名空间定义(将URI绑定到前缀或使命名空间成为默认名称空间)。
  3. 如果任何元素或属性使用某个前缀,则必须将前缀绑定到名称空间URI。 否则,文档将是(名称空间)无效。
  4. 不要使用mimetype text/xml ,这将导致严重的编码问题,并被弃用。 使用application/xml – 或者在这种情况下使用application/xhtml+xml – 来代替。