使用jQuery通过命名空间查找XML节点

时间:2012-11-13 09:08:08

标签: jquery xml namespaces find

我们有一个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 个答案:

答案 0 :(得分:5)

您可以使用attribute-contains jQuery-selector(请参阅here

xml.find("[nodeName*='x:']")

答案 1 :(得分: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'

见工作demo

答案 2 :(得分:1)

jQuery XML parsing with namespaces显示了如何搜索文字命名空间前缀。我认为这是一个“邪恶”的解决方法,因为它不是真正的XML处理。但看起来jQuery不支持任何真正的命名空间处理。所以你可能不得不去寻找解决方案。

答案 3 :(得分: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'));
});