1

在 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>
4

1 回答 1

1

以下将包含 或 的文本节点包装<>CDATA&中。在 Clojure 1.5.1 REPL 中使用 clojure.data.xml 0.0.7 测试:

(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))))))
于 2013-05-24T01:26:25.187 回答