使用 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 解析错误,似乎无法处理 &lt;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 节点的主要内容,如果未能解决你的问题,请参考以下文章

XML名命空间

为啥命名空间限定节点没有 XPath 语法?

如何使用 XPath 忽略命名空间

Atitit xml命名空间机制

如何在 CSS 选择器或 jQuery 中处理 XML 命名空间?

使用 jQuery $().find 解析带有命名空间的 XML