如何通过XML属性筛选XML节点?jQuery筛选实现疑问
嘿,我来帮你搞定这个XML节点筛选的问题!其实你之前用filter的思路方向是对的,只是可能没写完逻辑,另外还有更简洁的选择器写法,我都给你梳理清楚:
方案1:用复合选择器一步到位(最简洁)
你完全可以跳过filter函数,直接用jQuery的**:has()选择器+属性选择器**组合来精准匹配,代码非常清爽:
// 直接获取所有包含带有iType='Photo'属性的NewsPhoto子节点的NewsData var filteredItems = $(xml).find("NewsData:has(NewsPhoto[iType='Photo'])");
逻辑拆解:
:has(selector):专门用来匹配包含指定后代元素的父节点,这里就是找包含符合条件的NewsPhoto的NewsDataNewsPhoto[iType='Photo']:精准定位带有iType='Photo'属性的NewsPhoto节点- 两者组合起来就直接拿到了你需要的所有目标节点,不需要额外的判断逻辑
方案2:完善你之前的filter方法
如果还是想用filter函数来实现,只需要补全判断逻辑就好,其实一点都不复杂:
var filteredItems = $(xml).find('NewsData').filter(function() { // 检查当前NewsData下是否存在符合要求的NewsPhoto子节点 return $(this).children("NewsPhoto").filter("[iType='Photo']").length > 0; // 或者更简洁的等价写法:return $(this).has("NewsPhoto[iType='Photo']").length > 0; });
逻辑说明:
- 在
filter的回调函数里,返回true会保留当前节点,返回false则会被过滤掉 - 我们通过
length > 0来判断当前NewsData下是否存在带有iType='Photo'的NewsPhoto子节点,存在就保留该NewsData
小提示:
如果你的XML结构里NewsPhoto不是NewsData的直接子节点(比如嵌套在其他节点里),把children换成find就可以了,find会查找所有后代节点,而children只找直接子节点,后者效率更高哦。
内容的提问来源于stack exchange,提问作者lin
相关产品推荐
相关产品推荐

