Clojure的XML解析(Clojure XML Parsing)

2019-06-27 00:23发布

我无法找到如何解析XML文档和访问元素的任何信息。

我发现两种方法来解析XML文档

(clojure.zip/xml-zip (clojure.xml/parse file))

(parse-seq file)

但我似乎找到了如何处理由此产生的结构的任何信息?

源文件的指拉链query.clj关于如何查询的结果,但似乎缺少了。

Answer 1:

假设你有以下的XML文件解析:

<high-node>
   <low-node>my text</low-node>
</high-node>

加载clojure.xml

user=> (use 'clojure.xml)

解析时,XML将具有以下结构:

{:tag :high-node, :attrs nil, :content [{:tag :low-node, :attrs nil, :content ["my text"]}]}

然后你就可以以次在文件的内容来获得内容low-node

user=> (for [x (xml-seq 
              (parse (java.io.File. file)))
                 :when (= :low-node (:tag x))]
         (first (:content x)))

("my text")

同样,如果你想访问的低节点上的信息的完整列表,你会改变:when谓词(= (:high-node (:tag x)))

user=> (for [x (xml-seq 
              (parse (java.io.File. file)))
                 :when (= :high-node (:tag x))]
         (first (:content x)))

({:tag :low-node, :attrs nil, :content ["my text"]})

这工作,因为关键字可为功能操作。 请参阅有关列表和Clojure中的其他东西的问题和数据结构:关键词



Answer 2:

上述答案的作品,但我觉得轻松了许多使用clojure.data.zip.xml (以前是clojure-contrib.zip-filter.xml之前的Clojure 1.3)。

文件:

myfile.xml

<songs>
  <track id="t1"><name>Track one</name></track>
  <track id="t2"><name>Track two</name></track>
</songs>

码:

; Clojure 1.3
(ns example
  (:use [clojure.data.zip.xml :only (attr text xml->)]) ; dep: see below
  (:require [clojure.xml :as xml]
            [clojure.zip :as zip]))

(def xml (xml/parse "myfile.xml"))
(def zipped (zip/xml-zip xml))
(xml-> zipped :track :name text)       ; ("Track one" "Track two")
(xml-> zipped :track (attr :id))       ; ("t1" "t2")

不幸的是,你需要在依赖于拉data.zip得到这个不错的读/过滤器的功能。 这是值得依赖:)在雷音这将是(如8月17日- 2013年):

[org.clojure/data.zip "0.1.1"]

至于文档的data.zip.xml ...我只是看相对较小的源文件在这里看到什么是可能的。 另一个很好的SO回答这里了。



文章来源: Clojure XML Parsing