2

data.xml/parse 的文档说

数据以 defrecords 的形式返回,并且可以使用普通的 clojure 数据结构函数进行操作

是否可以手动或以编程方式推断这些 defrecord 的结构,如果可以,如何推断?

这是文档中的示例,有些压缩:

(let [input-xml (java.io.StringReader. 
                 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
                 <foo><bar><baz>The baz value</baz></bar></foo>")]
  (parse input-xml))

#clojure.data.xml.Element{:tag :foo,
                      :attrs {},
                      :content 
(
#clojure.data.xml.Element{:tag :bar, 

:attrs {},
:content (#clojure.data.xml.Element{:tag :baz,
         :attrs {},
         :content ("The baz value")})})}
4

1 回答 1

1

一般来说,defrecords 可以作为映射来操作,因为它们本质上就是这样。

例如:

problems.core=> (defrecord Dog [name collarsize])

现在,我们已经定义了一个 defrecord 类型,一个 Dog。

problems.core=> (keys (Dog. "laly" 1))           
(:name :collarsize)

很明显,我们都知道并喜欢在地图上操作的“键”功能运行良好。

但更进一步,我们发现 defrecord 确实是一张地图:

problems.core=> (map? (Dog. "laly" 1))           
true

那么——为什么要在一张简单的地图上大惊小怪呢?因为,由于 xml 具有明确定义的结构,因此我们可以在返回的每个 defrecord 中包含一些保证键是有意义的。特别是,每个 defrecord 元素都有“:tag、:attrs 和:content”。为了确认,您可以注意到这些常量 defrecord 属性始终存在于使用 clojure 解析 xml 的在线教程中(即http://www.gettingclojure.com/cookbook:xml-html)。

于 2012-06-30T05:11:54.847 回答