구문 분석이 완료되기 전에 스트림이 닫히기 때문에 clojure.data.xml
으로 XML 파일을 구문 분석하는 예외가 발생합니다. 이해가 안 무엇Clojure XML 스트림 폐쇄 된 예외
은 (this related answer에 의해 제안) with-open
가 닫을 전에 doall
는 XML 데이터의 평가를 강제되지 않는 이유입니다 :
(file->xml "example.xml")
;-> XMLStreamException ParseError at [row,col]:[80,1926]
Message: Stream closed com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next
: 예외를 throw
(:require [clojure.java.io :as io]
[clojure.data.xml :as xml])
(defn file->xml [path]
(with-open [rdr (-> path io/resource io/reader)]
(doall (xml/parse rdr))))
with-open
래퍼를 제거하면 예상대로 XML 데이터가 반환됩니다 (따라서 판독기가 닫혀 있지는 않지만 파일은 유효합니다). 그래서 아마 그이 관련되어
(defn parse
"Parses the source, which can be an
InputStream or Reader, and returns a lazy tree of Element records.
Accepts key pairs with XMLInputFactory options, see http://docs.oracle.com/javase/6/docs/api/javax/xml/stream/XMLInputFactory.html
and xml-input-factory-props for more information.
Defaults coalescing true."
[source & opts]
(event-tree (event-seq source opts)))
,하지만 내가 가지고있는 기능은 clojure.data.xml README의 "왕복"예를 매우 유사합니다 :
나는 (source xml/parse)
게으른 결과를 얻을 수 있음을 참조하십시오.
무엇이 여기에 있습니까?
흠. 흥미 롭 군. 무슨 일이 일어나는지 명확히 할 시간을내어 주셔서 감사합니다. – nrako
나는 이것을 "면역"이라고 부르지 않을 것이다. 마치 게으른 시퀀스의 게으른 시퀀스 인 게으른 것들의 또 다른 _level_ 인 것처럼 보입니다. – Svante
소스 코드를 파고 들지는 않았지만, "datomic.query.EntityMap"과 함께 보이는 "게으른 맵"유형의 구조 인 것처럼 보입니다. 문제는''doall''은''게으른 맵 ''이 아닌''게으른 시퀀스 ''만을위한 것이라고 생각합니다. –