我想在xml树上结合三个zip-filter查询的结果.我正在解析的XML看起来像这样:
<someroot>
<publication>
<contributors>
<person_name>
<surname>Surname A</surname>
</person_name>
<person_name>
<given_name>Given B</given_name>
<surname>Surname B</surname>
<suffix>Suffix B</suffix>
</person_name>
</contributors>
</publication>
</someroot>
Run Code Online (Sandbox Code Playgroud)
从这个例子中你可以看到<given_name>并且<suffix>是可选的 - 只<surname>需要它.这就是我的问题 - 如果我运行三个单独的查询,我得到的响应将彼此不同:
(xml-> xml :publication :contributors :person_name :given_name text)
(xml-> xml :publication :contributors :person_name :surname text)
(xml-> xml :publication :contributors :person_name :suffix text)
Run Code Online (Sandbox Code Playgroud)
运行这三个查询后,我将留下三个基数不匹配的序列; given_name并且suffix长度为1而surname长度为2.这使我无法组合每个名称的组成部分.我需要编写一个查询,在序列构建期间执行此名称连接.
我正在查看非常稀疏的文档,clojure.contrib.zip-filter.xml并且无法弄清楚我是如何做到的(或者如果它甚至可能).不幸的是,我是一个Clojure(和Lisp)的新手!任何人都可以指出我如何编写一个将连接其他三个嵌入式查询的查询?
我怎么能/我应该将单个序列作为参数传递给需要多个参数的函数?具体来说,我正在尝试使用笛卡尔积并将其传递给序列(见下文); 但是,当我这样做时,结果不是理想的结果.如果我不能传递单个序列作为参数,我怎么能/我应该将序列分解为多个参数?谢谢.
(use '[clojure.contrib.combinatorics :only (cartesian-product)])
(cartesian-product (["a" "b" "c"] [1 2 3]))
Run Code Online (Sandbox Code Playgroud)
结果是:
((["a" "b"]) ([1 2]))
Run Code Online (Sandbox Code Playgroud)
期望的结果
(("a" 1) ("a" 2) ("b" 1) ("b" 2))
Run Code Online (Sandbox Code Playgroud) 我试图用Maven编译我自己的clojure-contrib版本我得到以下异常:
Exception in thread "main" java.lang.IllegalStateException: Can't dynamically bind non-dynamic var: clojure.contrib.pprint/*format-str*, compiling:(dispatch.clj:90)
Run Code Online (Sandbox Code Playgroud)
我也使用以下命令编译它:
mvn package -Dclojure.jar=/usr/local/share/jars/clojure.jar
Run Code Online (Sandbox Code Playgroud)
clojure.jar是实际jar(在同一目录下)的链接,因为我使用的是从Git存储库编译的版本.
有任何想法吗?
提前感谢您的意见!=)
我曾经喜欢包含所有的clojure.contrib,并且需要所有的库.这使得find-doc可用作发现工具.
如今(clojure 1.4)clojure.contrib被分成许多子库.而这相当破坏了我的方案,这也意味着每次我需要一个新的库时我都不得不重新启动JVM.
所以我正忙着构建一个包含多行的project.clj文件:
[org.clojure/algo.generic "0.0.6"]
....
[org.clojure/data.xml "0.0.4"]
....
Run Code Online (Sandbox Code Playgroud)
因此,我可以让leiningen将每个clojure contrib库放在类路径上,无论我是否需要它们.
而且我认为这将是一个壮观的颈部疼痛,版本号和所有.
我想知道是否有人有更好的方法来做同样的事情?
编辑:考虑一下,如果某个网页有一个库名和当前版本的列表,我可以很容易地把它变成一个项目文件.
我想使用clojure自动填充网站上的数据.
为此,我想查询网页元素并创建http请求.我一直在寻找使用HttpUnit和contrib.clojure.zip-filter.xml.到目前为止,这两种方法都不对
是否有替代图书馆来帮助完成这项任务?
谢谢
鉴于未来版本的clojure如何阻止使用clojure-contrib作为单个项目 - 您如何找到事物的位置.
例如 - 这个实用程序:http://richhickey.github.com/clojure-contrib/javadoc.browse-api.html#clojure.contrib.javadoc.browse/open-url-in-browser方便 - 但它在哪里移动了根据新计划?
我需要将原始字节写入文件.我这样做:
(.write (FileOutputStream "/path") bytes)
Run Code Online (Sandbox Code Playgroud)
...其中bytes必须是byte []类型.请注意它不能是Byte [].
我试图用(字节)和/或(转换成数组)函数转换我的序列并且感到沮丧,一个例子:
user=> (bytes (into-array (filter #(not (= % 13)) (to-byte-array (File. "e:/vpn.bat")))))
java.lang.ClassCastException: [Ljava.lang.Byte; cannot be cast to [B (NO_SOURCE_FILE:0)
Run Code Online (Sandbox Code Playgroud)
继续:
带字节/ TYPE的in-array工作正常.但是,字节数组不会.文件变空:
(import 'FileOutputStream)
(use 'clojure.contrib.io)
(defn remove-cr-from-file [file]
(with-open [out (FileOutputStream. file)]
(let [dirty-bytes (to-byte-array file)
clean-seq (filter #(not (= 13 %)) dirty-bytes)
clean-bytes (byte-array clean-seq)]
(.write out clean-bytes))))
Run Code Online (Sandbox Code Playgroud) 如何从命令行运行使用clojure-contrib的clojure文件/脚本?我的(winodws)机器在类路径上有clojure-1.2.1.jar和clojure-contrib-1.2.0.jar.注意:我可以用以下内容启动REPL:java clojure.main我可以执行不使用clojure-contrib的*.clj文件:java clojure.main file-name.clj
我正在阅读《Programming Clojure》,这本书是基于clojure 1.1的。
我想使用最新的稳定版本 1.3,但它没有旧的 clojure-contrib。
import-static我的问题是我在 clojure 1.3 中找不到。我可以从旧的 clojure-contrib 复制宏定义并运行。
clojure 1.3 中是否有 import-static 或某种替代品?是否有诀窍可以在 1.3 的旧 clojure-contrib 中找到此类库和函数?
clojure ×10
clojure-contrib ×10
classpath ×1
html-parsing ×1
leiningen ×1
windows ×1
xml ×1
xml-parsing ×1