我们有一个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
。
答案 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'));
});