gpt4 book ai didi

xml - 在 Clojure 中搜索 xml

转载 作者:数据小太阳 更新时间:2023-10-29 01:41:34 25 4
gpt4 key购买 nike

我有以下示例 xml:

<data>
<products>
<product>
<section>Red Section</section>
<images>
<image>img.jpg</image>
<image>img2.jpg</image>
</images>
</product>
<product>
<section>Blue Section</section>
<images>
<image>img.jpg</image>
<image>img3.jpg</image>
</images>
</product>
<product>
<section>Green Section</section>
<images>
<image>img.jpg</image>
<image>img2.jpg</image>
</images>
</product>
</products>
</data>

我知道如何在 Clojure 中解析它

(require '[clojure.xml :as xml])
(def x (xml/parse 'location/of/that/xml'))

这将返回一个描述 xml 的嵌套映射

{:tag :data,
:attrs nil,
:content [
{:tag :products,
:attrs nil,
:content [
{:tag :product,
:attrs nil,
:content [] ..

这个结构当然可以用标准的 Clojure 函数遍历,但它可能会变得非常冗长,尤其是与,例如,用 XPath 查询它相比。是否有任何助手可以遍历和搜索这种结构?我怎样才能,例如

  • 获取所有 <product> 的列表
  • 仅获取 <images> 的产品标签包含 <image>带有文本“img2.jpg”
  • 获取section的产品是“红区”

谢谢

最佳答案

使用 Zippers来自 data.zip这是您的第二个用例的解决方案:

(ns core
(:use clojure.data.zip.xml)
(:require [clojure.zip :as zip]
[clojure.xml :as xml]))

(def data (zip/xml-zip (xml/parse PATH)))
(def products (xml-> data :products :product))

(for [product products :let [image (xml-> product :images :image)]
:when (some (text= "img2.jpg") image)]
{:section (xml1-> product :section text)
:images (map text image)})
=> ({:section "Red Section", :images ("img.jpg" "img2.jpg")}
{:section "Green Section", :images ("img.jpg" "img2.jpg")})

关于xml - 在 Clojure 中搜索 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11537923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com