5

我们有一个 XML 文件,其中一些节点是命名空间的。基本上该文件如下所示:

<foo>
    <bar xmlns:x="http://www.example.com/">
        <x:bla foo="bar" />
    </bar>
</foo>

我们要实现的是我们要选择x:bla节点,可惜我们事先并不知道节点的名字,只知道它的命名空间。因此,我们所知道的基本上是它是一个x:*节点。

find现在,问题是:一旦我们使用 解析了 XML 文件,我们如何使用 jQuery 的方法选择这个节点$.parseXML

使用$(xml).find("x\\:bla, bla")有效,但前提是我知道该节点被调用bla

4

4 回答 4

5

您可以使用属性包含 jQuery 选择器(请参阅此处

xml.find("[nodeName*='x:']")
于 2012-11-13T10:36:03.370 回答
1

.parseXML()给我 XML 解析错误,它似乎无法处理<x:bla..语法。

所以我只是使用带有自定义选择器的 jQuery 来按命名空间查找元素:

$.expr[':'].findNS = function(obj, idx, meta, stack) {
    if (obj.nodeName.indexOf(meta[3].toUpperCase()+':') === 0) {
        return true;
    }
    return false;
};

var xml="<foo><bar><x:bla atr='attvalue' /></bar></foo>";

alert( $(xml).find(':findNS(x)').attr('atr') ); // Alerts 'attvalue'

查看工作演示

于 2012-11-13T10:21:32.093 回答
1

带有命名空间的 jQuery XML 解析展示了如何搜索文字命名空间前缀。我认为这是一种“邪恶”的解决方法,因为它不是真正的 XML 处理。但看起来 jQuery 不支持任何真正的命名空间处理。因此,您可能必须寻求该解决方案。

于 2012-11-13T10:28:42.030 回答
0

我有类似的需求,并且想正确处理命名空间。这是一个对我有用的例子。在这种情况下,我正在阅读一个包含 MediaRSS 属性的 RSS 提要。

var xmlDoc = $.parseXML(data);
var $xml = $(xmlDoc);
var ns = {};
$xml.find('item').each(function() {
    console.log('title = ' + $(this).find('title').text());
    console.log('link  = ' + $(this).find('link').text());
    console.log('thumb = ' + 
        $(this.getElementsByTagNameNS('http://search.yahoo.com/mrss','thumbnail')).attr('src'));
});
于 2015-04-21T01:26:55.357 回答