使用 jQuery 按命名空间查找 XML 节点
Posted
技术标签:
【中文标题】使用 jQuery 按命名空间查找 XML 节点【英文标题】:Finding an XML node by namespace with jQuery 【发布时间】:2012-11-01 17:15:47 【问题描述】:我们有一个 XML 文件,其中一些节点是命名空间的。基本上文件是这样的:
<foo>
<bar xmlns:x="http://www.example.com/">
<x:bla foo="bar" />
</bar>
</foo>
我们要实现的是我们要选择x:bla
节点,可惜我们事先并不知道节点的名字,只知道它的命名空间。因此,我们所知道的基本上是它是一个x:*
节点。
现在的问题是:一旦我们使用$.parseXML
解析了XML 文件,我们如何使用jQuery 的find
方法选择这个节点?
使用$(xml).find("x\\:bla, bla")
有效,但前提是我知道该节点被称为bla
。
【问题讨论】:
你可以找到一个可能的解决方案可能是here 感谢您的提示,但这根本与命名空间无关(或者我错过了什么?)。 也许这会有所帮助:link [1]:***.com/questions/853740/… 【参考方案1】:我也有类似的需求,想正确处理命名空间。这是一个对我有用的例子。在这种情况下,我正在阅读一个包含 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'));
);
【讨论】:
【参考方案2】:您可以使用包含属性的 jQuery 选择器(请参阅here)
xml.find("[nodeName*='x:']")
【讨论】:
不,它没有。它忽略了 XML 命名空间的所有内容...... XML 片段的创建者可能随时更改本地前缀,这会破坏您的实现......即使只是升级他的工具(可能在幕后使用某种序列化)也可能会破坏你的应用... Hmmmm ...是的,这基本上是正确的,但是还有什么其他解决方案(至少在我现在所处的场景中,我不在乎绝对存在,但细微的差别在命名空间和用于该命名空间的本地前缀之间,因此没关系)?【参考方案3】:jQuery XML parsing with namespaces 展示了如何搜索文字名称空间前缀。我认为这是一种“邪恶”的解决方法,因为它不是真正的 XML 处理。但看起来 jQuery 不支持任何真正的命名空间处理。所以你可能不得不选择那个解决方案。
【讨论】:
【参考方案4】:.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
【讨论】:
我错过了 xmlns-namespace 定义,刚刚更新了。以上是关于使用 jQuery 按命名空间查找 XML 节点的主要内容,如果未能解决你的问题,请参考以下文章