将getElementsByTagNameNS与名称空间别名一起使用

时间:2014-09-30 15:13:35

标签: javascript google-chrome xml-parsing

是否有可能使用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;
}

0 个答案:

没有答案