2013-05-23 2 views
1

В Clojure, как бы я прошел через структуру данных XML и обернул весь текстовый контент, содержащий специальные символы, с тегом CDATA?Оберните текст 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

Следующая оборачивает текстовые узлы, содержащие <, > или & в 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)))))) 
+0

Это билет и красиво сделано. – yakshaver

Смежные вопросы