添加限定XML元素不会继承命名空间URI

时间:2014-05-14 11:28:50

标签: javascript xml node.js xml-namespaces xmldom

如何将带有ns前缀的元素附加到另一个元素并使其从文档继承namespaceURI映射?

作为示例:实例化解析XML字符串的文档:pp:q元素从namespaceURI == 'abc'元素继承root,但向{{1}追加新元素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 library

nodejs中投放

[以下编辑回应kjhughes]

我也试过了xmldom,但我也觉得这样做有些不对劲。
将这些行附加到代码中:

createElementNS

2 个答案:

答案 0 :(得分:0)

根据document.createElement()的文档,

  

var element = document.createElement(tagName);

     

元素是创建的元素对象。

     

tagName 是一个字符串   指定要创建的元素的类型。的nodeName   使用tagName的值初始化created元素。 不要使用   使用此方法的限定名称(如“html:a”)

您应该使用document.createElementNS()

每个问题更新更新:

请注意命名空间本身是重要的,而不是命名空间前缀。当您为给定命名空间提供多个前缀时,API没有义务使用特定的命名空间前缀。此外,请注意.namespaceURI名称空间 名称空间前缀

答案 1 :(得分:0)

您感到困惑,因为您使用console.log(String(doc));输出XML。请改用XML序列化程序:console.log((new XMLSerializer()).serializeToString(doc));

要记住的其他要点

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