Загрузить XML с Clojure с помощью XStream - PullRequest
2 голосов
/ 10 ноября 2010

Я пытаюсь загрузить XML-файл, используя XStream API с Clojure. Этот процесс не работает, и я не знаю, что происходит.

У меня есть тип, определенный в пространстве имен:

(ns myapp.domain.foo)

(defrecord Foo [value price])

И у меня есть функция, которая импортирует данные из XML-файла, используя XStream.

(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 Ответ

1 голос
/ 10 ноября 2010

Запись не содержит методов получения и установки полей. Может ли XStream сериализовать поля напрямую?

Также вам необходимо указать пространство имен foo в пространстве имен xml-reader.

(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 не генерируется.

...