是否有可能使用javascript方法' getElementsByTagNameNS'通过传递命名空间别名而不是命名空间uri?
我正在解析多个XML文档,并在javascript中搜索具有不同命名空间的多个标记。
我创建了以下与stackoverflow article相关的功能:
// The node name is passed with namespace e.g. 'c:label'
function getElementsByTagNameCrossBrowser (xmlNode, tagName) {
var elementCollection, pureTagName, nameSpace;
elementCollection = xmlNode.getElementsByTagName(tagName);
if (elementCollection.length === 0) {
nameSpace = tagName.split(':')[0];
pureTagName= tagName.split(':')[1];
elementCollection = xmlNode.getElementsByTagNameNS(nameSpace, pureTagName);
}
return elementCollection;
}
在FF和IE中,此功能提供了正确的结果,但在Chrome中,“getElementsByTagName”'传递包含名称空间的tagName时,方法不返回任何结果。
如果我只搜索' pureTagName'没有考虑名称空间'我得到了太多结果。
正如我在MDN-Article中看到的那样,getElementsByTagNameNS'方法需要命名空间URI,但目前我无法访问URI。通过传递名称空间别名,是否有解决方法或其他方法来使用此方法?
编辑:
这是我目前的Workaraound:
function getElementsByTagNameChromeNamespace (xmlNode, tagName) {
var elementCollection, pureTagName, i, tmpNode, tmpNodeName, resultingCollection;
// If there is no namespace return normal collection.
if (tagName.indexOf(':') === -1) {
return xmlNode.getElementsByTagName(tagName);
}
resultingCollection = [];
pureTagName = tagName.split(':')[1];
elementCollection = xmlNode.getElementsByTagName(pureTagName);
for (i = 0; i < elementCollection.length; i++) {
tmpNode = elementCollection[i];
tmpNodeName = tmpNode.nodeName;
if (tmpNodeName === tagName) {
resultingCollection.push(tmpNode);
}
}
return resultingCollection;
},
function getElementsByTagNameCrossBrowser (xmlNode, tagName) {
var elementCollection;
elementCollection = xmlNode.getElementsByTagName(tagName);
if (elementCollection.length === 0) {
elementCollection = this.getElementsByTagNameChromeNamespace(xmlNode, tagName);
}
return elementCollection;
}