2

我有一个关于如何在 clojure 中对 xml 文件执行 select * 样式“查询”的问题。说,我有这个 XML,你可以从这个 URL http://api.eventful.com/rest/events/search?app_key=4H4Vff4PdrTGp3vV&keywords=music&location=Belgrade&date=Future获得(如果我把它贴在这里它看起来不好的)

我想为 XML 中所有重复的“行”获取地图向量(以标签作为键及其值的地图)。因此,在此示例 XML 中,每个地图都是一个事件。我可以解析它,并制作它的拉链结构。我也知道如何使用结构映射来做到这一点,但我想要一个更通用的解决方案,对于任何给定的 xml,也许还有一些开始的标签。我想要的与此Simple Clojure XML 编辑相反。任何想法都会很棒!

谢谢!

4

1 回答 1

2

你应该看看enlive。它将 XML 转换为不同的基于列表/映射的结构,并允许对其进行查询。

例如,要选择所有事件,您必须执行以下操作:

(require '[net.cgrand.enlive-html :as html])
(def data (html/xml-resource "your.xml"))
(html/select data [:events])

获取所有事件标题:

(select data [:even :title :*])

我已经有几个月没有使用它了,所以我有点生疏了。但是网上有很多资料。

编辑:

您实际上可以使用 zippers 来导航由 xml-resource 创建的数据结构。这是一个示例,我在其中查找任何带有单词库的链接,然后从中走出来以获取其父节点。

(require [net.cgrand.enlive-html :as html])
(require [net.cgrand.xml :as xml])
(require [clojure.zip :as z])

(map
  (comp z/node z/up)
  (@#'html/zip-select-nodes*
   (map xml/xml-zip (html/html-resource page2))
   (@#'html/automaton
    [:a (html/re-pred #".*[Bb]ank.*")])))

我必须使用 @#' 作为函数 zip-select-nodes* 和自动机是命名空间私有的。

于 2012-09-14T18:30:27.203 回答