javascript - XPATH获取所选节点的根节点

标签 javascript xml xpath

我使用Defiant.js,您可以在其中使用XPATH表达式查询json数据。现在,我想选择搜索结果的根节点。

源代码

var data = [{
    "id": 1,
    "categories": [{
        "id": 1,
        "title": "Category1"
    }, {
        "id": 2,
        "title": "Category2"
    }]
}, {
    "id": 2,
    "categories": [{
        "id": 1,
        "title": "Category1"
    }]
}, {
    "id": 3,
    "categories": [{
        "id": 2,
        "title": "Category2"
    }, {
        "id": 3,
        "title": "Category3"
    }]
}];

var result = JSON.search(data, '//categories[contains(id, "2")]')


通过该表达式,我得到了两个类别对象的数组

[{
    "id": 2,
    "title": "Category2"
}, {
    "id": 2,
    "title": "Category2"
}]


但是我想得到流行歌曲的根源

[{
    "id": 1,
    "categories": [{
        "id": 1,
        "title": "Category1"
    }, {
        "id": 2,
        "title": "Category2"
    }]
}, {
    "id": 3,
    "categories": [{
        "id": 2,
        "title": "Category2"
    }, {
        "id": 3,
        "title": "Category3"
    }]
}]


有可能这样做吗?提前致谢!

最佳答案

基本上,有效的XML中总是只有一个根节点,选择根应该和选择文档中的第一个节点一样简单:

/*


我认为使用defiant.js时,相同的概念也适用于JSON。始终只有一个JSON对象充当根。

无论如何,如果您真的想从后代节点上下文开始,则可以使用ancestor轴任意向上爬树。假设我们当前在后代节点之一(例如categories)中,则可以通过以下方式进入根节点:

ancestor::*[not(parent::*)]


基于JSON数据的示例如下所示:

var xpath1 = '//categories[contains(id, "2")]/ancestor::*[not(parent::*)]';
var result1 = JSON.search(data, xpath1)

var xpath2 = '/*[not(parent::*) and .//categories[contains(id, "2")]]';
var result2 = JSON.search(data, xpath2)




更新:

在此上下文中,“根”似乎是指此xpath引用的元素:/*/*

如果是正确的话,您可能想要这样的东西(您也可以将descendant::替换为缩写版本.//):

/*/*[descendant::subcategories[contains(id, '4')]]


更普遍 :

/*/*[descendant::{some filter here}] 


或者,如果您的过滤器也需要检查“ root” JSON对象的属性,则可以使用descendant-or-self代替descendant

/*/*[descendant-or-self::{some filter here}]

关于javascript - XPATH获取所选节点的根节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29778173/

相关文章:

jquery - 在 Firefox 上开发的 Javascript 在 IE 上失败的典型原因是什么?

python - 解析updateinfo.xml

html - xpath 在页面中查找特定链接

python - <br/> 标签之间节点的 Scrapy 选择器

javascript - 替换或删除完整字符串中包含单词中@temp之前的字符

Javascript 自定义库

javascript - 为其他服务器上托管的 JavaScript 启用 Gzip 压缩

xml - 使用 XSLT 修改 XML 文档的属性

java - 如何搜索其他网站的内容并检索结果并放置在我们的 Android 应用程序中?

dom - 使用 XPath 查找当前选择的 <option>