2014-03-01 42 views
4

XML可以原生Clojure的数据类型,并允许像为什么Clojure将xml文档表示为哈希映射?

(def myxml <inventors><clojure>Rich Hickey</clojure></inventors>) 

简单的定义是什么因素妨碍当前解析器从这样

{:inventors {:clojure "Rich Hickey"}} 

,而不是这个

{:tag :inventors, :attrs nil, :content [{:tag :clojure, :attrs nil, :content ["Rich Hickey"]}]} 

的粗略搜索类似的表示在其他lisps我看到SXML 它支持命名空间。

+1

在'{:发明者{:clojure} Rich Hickey“}}',如果有的话,你会在哪里放置价值? – leontalbot

+0

不知道@ user1184248命名空间和重复的节点名称。 – KobbyPemson

回答

7

你们的榜样尚不当你进入另一个发明者工作:

{:inventors 
    {:clojure "Rich Hickey"} 
    {:lisp "John McCarthy"}} 

(错误:这不是一个地图)如果你把两成一个子图

,你不能有更多的比给定类型的一个孩子多。这很重要,因为示例XML结构没有正确设计。它应该是这样的:

<inventors> 
    <inventor> 
    <language>Clojure</language> 
    <person>Rich Hickey</person> 
    </inventor> 
    <inventor> 
    <language>Lisp</language> 
    <person>John McCarthy</person> 
    </inventor> 
</inventors> 

你可以做的是使用列表或载体直接,而不是明确指定一个标签的成分:

[:inventors {} 
    [:inventor {} 
    [:language {} "Clojure"] 
    [:person {} "Rich Hickey"]] 
    [:inventor {} 
    [:language {} "Lisp"] 
    [:person {} "John McCarthy"]]] 

看起来像这样的常用使用的地图结构:

{:tag :inventors 
:attrs nil 
:content [{:tag :inventor 
      :attrs nil 
      :content [{:tag :language 
         :attrs nil 
         :content "Clojure"} 
         {:tag :person 
         :attrs nil 
         :content "Rich Hickey"}]} 
      {:tag :inventor 
      :attrs nil 
      :content [{:tag :language 
         :attrs nil 
         :content "Lisp"} 
         {:tag :person 
         :attrs nil 
         :content "John McCarthy"}]}]} 

这可能类似于上面的向量的建议是清洁的,但你必须定义访问功能(理智)与载体的工作。这些地图在Clojure中已经是它们自己的访问器函数,所以你可以直接和惯用地使用它们。

+0

你说得对xml没有正确设计,但不幸的是,这是有效的XML和应用程序,我想与生产或消费xmls一样。 – KobbyPemson

+0

@KobbyPemson:我很可惜,但这对于手头的问题并不相关,因为您不想设计只能表示XML文档的一小部分的XML表示,对吗? :) – Svante

+0

好点,但你不得不承认当前的表示比XML更不可读,并且任何表示都应该允许在任何有效的xml上进行无损循环跳转。 – KobbyPemson

5

替代方括号的卷曲的和你在说什么是hiccup格式。

user=> (hiccup.core/html [:inventors [:clojure "Rich Hickey"]]) 
"<inventors><clojure>Rich Hickey</clojure></inventors>" 

您可以使用打嗝式样与data.xml

+0

难道不是这样吗? (xml - >哈希映射)。 – leontalbot