在Clojure中改变XML

mac*_*mac 10 xml clojure

Clojures clojure.xml/parse,clojure.zip/xml-zip和clojure.contrib.zip-filter.xml/xml->是用于从xml中提取值的优秀工具,但如果我想更改xml(结果如果) clojure.zip/xml-zip)基于我从xml->"查询"中学到的东西,并将结果写回xml?

我原以为(clojure.contrib.prxml/prxml(clojure.xml/parse xml-content))吐出xml,但事实并非如此.

lev*_*and 7

您可以像使用Clojure的其他任何不可变结构一样使用xml-zip库来"改变"XML.它有一整套"变异"功能:(api)

他们都返回一个完整的"修改"拉链.然后,您可以转到该拉链的顶部,并使用xml/emit来打印XML.


Mic*_*zyk 5

更新:实际上,为了发布XML,最好使用clojure.contrib.lazy-xml/emit,因为clojure.xml/emit目前可能会破坏事物!请参阅下面的评论.

(暂时留下这个答案作为警告.)


如果我理解正确,问题的主要内容与将(可能突变的)XML表示转换回XML文本有关吗?

如果是这样,看看clojure.xml/emitclojure.xml/emit-element:

user> (with-out-str (xml/emit {:tag :foo :attrs {:bar "quux"}}))
"<?xml version='1.0' encoding='UTF-8'?>\n<foo bar='quux'/>\n"
Run Code Online (Sandbox Code Playgroud)

(with-out-str捕获打印输出并将其包装为字符串;由于某种原因xml/emit打印xml,所以它在这里派上用场.emit-element如果<?xml version='1.0' encoding='UTF-8'?>不是你想要的话,你会想要使用.)