用Clojure修改XML

10

Clojure的clojure.xml/parse, clojure.zip/xml-zip和clojure.contrib.zip-filter.xml/xml->是提取xml值的绝佳工具,但如果我想根据从xml->“查询”中学到的内容更改xml(即clojure.zip/xml-zip的结果),并将结果作为xml写回,该怎么办?

我本来以为(clojure.contrib.prxml/prxml (clojure.xml/parse xml-content))会输出xml,但事实并非如此。

2个回答

7
你可以使用xml-zip库来像处理Clojure的其他不可变结构一样“改变”XML。它具有完整的“修改”函数:(api)。这些函数都会返回一个完整的“修改”zipper。然后,您可以转到该zipper的顶部,并使用xml/emit打印XML。

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"

(with-out-str 可以捕获打印输出并将其封装为字符串;由于某种原因,xml/emit 会打印出 XML,所以在这里非常有用。如果你不想要 <?xml version='1.0' encoding='UTF-8'?>,则应使用 emit-element。)


1
为了未来读者的利益:显然,这在可用性方面非常有限,因为clojure.xml/emit目前对其工作采取了非常天真的方法,例如忽略将内容编码为XML实体...请改用clojure.contrib.lazy-xml/emit。另请参见我的回答后续问题:https://dev59.com/IEzSa4cB1Zd3GeqPoKCy#2463768 - Michał Marczyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接