首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure XML解析

Clojure XML解析
EN

Stack Overflow用户
提问于 2009-07-28 13:18:42
回答 2查看 24.6K关注 0票数 67

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

我发现了两种解析xml文档的方法

代码语言:javascript
复制
(clojure.zip/xml-zip (clojure.xml/parse file))

代码语言:javascript
复制
(parse-seq file)

但是我似乎可以找到任何关于如何处理产生的结构的信息?

关于如何查询结果,源文件的引用是zip-query.clj,但似乎也没有。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-28 17:36:46

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

代码语言:javascript
复制
<high-node>
   <low-node>my text</low-node>
</high-node>

加载clojure.xml

代码语言:javascript
复制
user=> (use 'clojure.xml)

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

代码语言:javascript
复制
{:tag :high-node, :attrs nil, :content [{:tag :low-node, :attrs nil, :content ["my text"]}]}

然后,您可以对文件的内容进行排序,以获得low-node的内容

代码语言:javascript
复制
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)))

代码语言:javascript
复制
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"]})

这是因为关键字可以作为函数运行。请参阅Questions about lists and other stuff in ClojureData Structures: Keywords

票数 83
EN

Stack Overflow用户

发布于 2012-03-07 11:14:54

上面的答案是有效的,但我发现使用clojure.data.zip.xml (在Clojure1.3之前是clojure-contrib.zip-filter.xml )要容易得多。

文件:

myfile.xml

代码语言:javascript
复制
<songs>
  <track id="t1"><name>Track one</name></track>
  <track id="t2"><name>Track two</name></track>
</songs>

代码:

代码语言:javascript
复制
; 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的依赖才能获得这种出色的读取/过滤功能。这是值得依赖的:)lein中应该是(截至2013年8月17日):

代码语言:javascript
复制
[org.clojure/data.zip "0.1.1"]

至于data.zip.xml的文档...我只查看相对较小的源文件here,看看有什么可能。另一个很好的答案也是here

票数 57
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1194044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档