我无法弄清楚clojure-xml文档的上下文中的InputStream是什么。 clojure-xml documentation将clojure-xml / parse的输入列为“File,InputStream或String命名URL”。
我试过了:
(defn open-file
"Attempts to open a file and complains if the file is not present."
[file-name]
(let [file-data (try
(slurp file-name)
(catch Exception e))]
file-data))
(clojure-xml/parse (utl/open-file "test.xml"))
并收到此错误:
FileNotFoundException /home/cnorton/projects/clojure/xml-lib/<
(No such file or directory) java.io.FileInputStream.open
(FileInputStream.java:-2)
但这有效:
(clojure-xml/parse "test.xml")
为什么不将InputStream视为打开文件的结果?因此,这个上下文中的InputStream是什么?
答案 0 :(得分:4)
InputStream引用java.io.InputStream。在Clojure中获取一个的最简单方法是使用clojure.java.io/input-stream。
clojure.xml / parse应该接受clojure.java.io/input-stream会做的任何事情。例子:
(require '[clojure.xml :as xml])
(require '[clojure.java.io :as io])
(xml/parse "/Users/bsmith/.m2/settings.xml")
(xml/parse (io/input-stream "/Users/bsmith/.m2/settings.xml"))
“/Users/bsmith/.m2/settings.xml”与“文件名”之间的区别:
“/ Users / bsmith / .m2 / settings.xml”是一个字符串,用于指定文件系统上文件的(绝对)路径。但是,在Java世界中,类java.io.File是表示文件路径的惯用方法。 clojure.java.io不关心,它会接受命名文件的String或命名文件的java.io.File。
您在初始帖子中收到的错误消息是因为您首先使用slurp将XML加载到String中。 (不是一个好主意,因为XML带有它自己的编码,slurp无法解释。)无论如何,你传递了String on和clojure.java.io最终试图解释实际内容< / em>将XML作为文件路径,显然无法正常工作。