1

clojure-xml ドキュメントのコンテキストで InputStream が何であるかを理解できません。clojure-xmlのドキュメントには、clojure-xml/parse への入力が「ファイル、InputStream、または 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 とは何ですか?

4

1 に答える 1

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は気にせず、ファイルに名前を付ける文字列またはファイルに名前を付けるjava.io.Fileを受け入れます。

最初の投稿で受け取ったエラーメッセージは、最初にslurpを使用してXMLを文字列にロードしたために発生しました。(XMLには独自のエンコーディングが含まれているため、slurpは解釈できません。)いずれにしても、Stringを渡すと、clojure.java.ioは最終的にXMLの実際のコンテンツを次のように解釈しようとしました。明らかに機能しないファイルパス。

于 2012-06-26T18:50:20.463 に答える