包含带有CDATA标记的特殊字符的XML文本

时间:2013-05-23 23:10:32

标签: xml clojure xml-parsing

在Clojure中,我如何遍历XML数据结构并将包含特殊字符的所有文本内容包装为CDATA标记?

例如,以下XML:

<root>
  <child>no special characters</child>
  <child>special characters &amp;</child>
  <parent>
    <child>special characters &gt;</child>
  </parent>
</root>

应该成为

<root>
  <child>no special characters</child>
  <child><![CDATA[special characters &]]></child>
  <parent>
    <child><![CDATA[special characters >]]></child>
  </parent>
</root>

1 个答案:

答案 0 :(得分:1)

以下内容包含CDATA中包含<>&的文本节点。使用clojure.data.xml 0.0.7:

在Clojure 1.5.1 REPL上测试
(require '[clojure.data.xml :as xml] '[clojure.zip :as zip])

;; as in the question text:
(def test-xml
  "<root>
     <child>no special characters</child>
     <child>special characters &amp;</child>
     <parent>
       <child>special characters &gt;</child>
     </parent>
   </root>")

(def x (xml/parse-str test-xml))
(def z (zip/xml-zip x))

(defn contains-special-chars? [s]
  (.find (re-matcher #"[<>&]" s)))

(loop [z z]
  (if (zip/end? z)
    (-> z zip/root xml/emit-str)
    (let [n (zip/node z)]
      (if (string? n)
        (if (contains-special-chars? n)
          (recur (zip/edit z xml/->CData))
          (recur (zip/next z)))
        (recur (zip/next z))))))