【问题标题】:clojure: creating vector of maps from xmlclojure:从 xml 创建地图矢量
【发布时间】:2012-09-15 02:54:37
【问题描述】:

我有一个关于如何在 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 edit相反。任何想法都会很棒!

谢谢!

【问题讨论】:

  • 我知道有一个用于 xpath 的 clojure 库,但我认为我可以使用 zippers 来做到这一点......不过运气不好......

标签: vector clojure xml-parsing maps


【解决方案1】:

你应该看看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* 和自动机是命名空间私有的。

【讨论】:

  • 拉链很酷,你可以将它们与Enlive一起使用,但它有点隐藏。我将添加到我的答案信息中!
  • 我在想更像这样的东西: (->> (en-html/select xml-doc [:holiday]) (map en-html/text) (partition 2) (map #( zipmap [:name :month] %)))。它适用于这个 xml International Lefthanders DayAugust13Rover 的生日October12 ...但不与矿。我无法从我的提要中选择任何内容。
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 2023-04-09
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多