Clojure XML解析

Ham*_*aya 65 xml clojure clojure-contrib

我找不到有关如何解析xml文档和访问元素的任何信息.

我找到了两种解析xml文档的方法

(clojure.zip/xml-zip (clojure.xml/parse file))
Run Code Online (Sandbox Code Playgroud)

(parse-seq file)
Run Code Online (Sandbox Code Playgroud)

但我似乎可以找到有关如何处理结果结构的任何信息?

源文件是指如何查询结果的zip-query.clj,但似乎也没有.

Pin*_*hle 82

假设您要在文件中解析以下xml:

<high-node>
   <low-node>my text</low-node>
</high-node>
Run Code Online (Sandbox Code Playgroud)

你加载clojure.xml:

user=> (use 'clojure.xml)
Run Code Online (Sandbox Code Playgroud)

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

{:tag :high-node, :attrs nil, :content [{:tag :low-node, :attrs nil, :content ["my text"]}]}
Run Code Online (Sandbox Code Playgroud)

然后你可以搜索文件的内容以获取以下内容low-node:

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

("my text")
Run Code Online (Sandbox Code Playgroud)

同样,如果您想要访问低节点上的整个信息列表,您可以将: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"]})
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为关键字可以作为函数运行.请参阅有关Clojure数据结构中的列表和其他内容的问题:关键字


ove*_*ink 56

上面的答案有效,但我觉得它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>
Run Code Online (Sandbox Code Playgroud)

码:

; 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")
Run Code Online (Sandbox Code Playgroud)

不幸的是,你需要依赖data.zip来获得这个不错的读/过滤功能. 这是值得的依赖:)lein它将是(截至2013年8月17日):

[org.clojure/data.zip "0.1.1"]
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我正在进行的项目非常有用. (2认同)
  • 我不明白为什么(xml-&gt;压缩:track:name文本)将起作用,但是(xml-&gt;压缩的:songs:track:name文本)将不起作用,或(xml-&gt;压缩的:name文本)将不起作用。不知道为什么必须指定标记的嵌套级别,而不必指定其他级别。 (2认同)