使用XStream使用clojure加载xml

时间:2010-11-10 03:38:25

标签: xml clojure xstream

我正在尝试使用带有clojure的XStream api加载xml文件。这个过程不起作用,我不知道发生了什么。

我在命名空间中定义了一个类型:

(ns myapp.domain.foo)

(defrecord Foo [value price])

我有一个使用XStream从xml文件导入数据的函数。

(ns myapp.xml.xml-reader
 (:import myapp.domain.foo.Foo)
 (:import com.thoughtworks.xstream.XStream)
 (:import com.thoughtworks.xstream.io.xml.DomDriver))

(defn load-from-xml
  [xml]
  (let [parser (XStream. (DomDriver.))]
    (.alias parser "Foo" Foo)
    (.fromXML parser reader))) 

当我尝试使用此函数将xml数据加载到Foo时,键入以下错误:

com.thoughtworks.xstream.mapper.CannotResolveClassException:myapp.domain.foo.Foo : myapp.domain.foo.Foo

这是我的测试代码:

(deftest leitor-xml-test
   (let[ xml "<Foo><value>43.5</value><price>1000</price></Foo>"]
     (testing "should be possible to load xml"
  (let [ foo-list (load-from-xml xml)]
     (is (= (count foo-list) 1)))))

我不明白为什么会这样。 我认为问题可能是命名空间,因为当我在repl工作中使用它时很好。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

记录不提供字段的getter和setter。 XStream能否直接序列化字段?

此外,您应该在xml-reader命名空间中要求foo命名空间。

(ns myapp.xml.xml-reader
  (:require
    myapp.domain.foo)
  (:import
    myapp.domain.foo.Foo
    com.thoughtworks.xstream.XStream
    com.thoughtworks.xstream.io.xml.DomDriver))

否则不会生成defrecord。