|
113 | 113 | (defn attributes [e] |
114 | 114 | (let [v (vec (:attrs e))] |
115 | 115 | (reify org.xml.sax.Attributes |
116 | | - (getLength [] (count v)) |
117 | | - (getURI [i] (namespace (key (v i)))) |
118 | | - (getLocalName [i] (name (key (v i)))) |
119 | | - (getQName [i] (name (key (v i)))) |
120 | | - (#^String getValue [#^int i] (val (v i))) |
121 | | - (#^String getType [#^int i] "CDATA")))) |
| 116 | + (getLength [_] (count v)) |
| 117 | + (getURI [_ i] (namespace (key (v i)))) |
| 118 | + (getLocalName [_ i] (name (key (v i)))) |
| 119 | + (getQName [_ i] (name (key (v i)))) |
| 120 | + (getValue [_ uri name] (get (:attrs e) name)) |
| 121 | + (#^String getValue [_ #^int i] (val (v i))) |
| 122 | + (#^String getType [_ #^int i] "CDATA")))) |
122 | 123 |
|
123 | 124 | (defn- emit-element |
124 | 125 | "Recursively prints as XML text the element struct e. To have it |
125 | 126 | print extra whitespace like clojure.xml/emit, use the :pad true |
126 | 127 | option." |
127 | | - [e ch] |
| 128 | + [e #^org.xml.sax.ContentHandler ch] |
128 | 129 | (if (instance? String e) |
129 | 130 | (.characters ch (.toCharArray #^String e) 0 (count e)) |
130 | 131 | (let [nspace (namespace (:tag e)) |
131 | 132 | qname (name (:tag e))] |
132 | | - (.startElement ch nspace qname qname (attributes e)) |
| 133 | + (.startElement ch (or nspace "") qname qname (attributes e)) |
133 | 134 | (doseq [c (:content e)] |
134 | 135 | (emit-element c ch)) |
135 | | - (.endElement ch nspace qname qname)))) |
| 136 | + (.endElement ch (or nspace "") qname qname)))) |
| 137 | + |
136 | 138 |
|
137 | 139 | (defn emit |
138 | | - [e & optseq] |
139 | | - (let [opts (apply array-map optseq) |
140 | | - content-handler (atom nil) |
| 140 | + [e & {:as opts}] |
| 141 | + (let [content-handler (atom nil) |
141 | 142 | trans (-> (javax.xml.transform.TransformerFactory/newInstance) |
142 | 143 | .newTransformer)] |
143 | 144 |
|
|
157 | 158 | trans |
158 | 159 | (javax.xml.transform.sax.SAXSource. |
159 | 160 | (reify org.xml.sax.XMLReader |
160 | | - (getContentHandler [] @content-handler) |
161 | | - (setDTDHandler [handler]) |
162 | | - (setFeature [name value]) |
163 | | - (setProperty [name value]) |
164 | | - (setContentHandler [ch] (reset! content-handler ch)) |
165 | | - (#^void parse [#^org.xml.sax.InputSource _] |
166 | | - (.startDocument @content-handler) |
167 | | - (emit-element e @content-handler) |
168 | | - (.endDocument @content-handler))) |
| 161 | + (getContentHandler [_] @content-handler) |
| 162 | + (setDTDHandler [_ handler]) |
| 163 | + (setFeature [_ name value]) |
| 164 | + (setProperty [_ name value]) |
| 165 | + (setContentHandler [_ ch] (reset! content-handler ch)) |
| 166 | + (#^void parse [_ #^org.xml.sax.InputSource _] |
| 167 | + (when @content-handler |
| 168 | + (.startDocument @content-handler) |
| 169 | + (emit-element e @content-handler) |
| 170 | + (.endDocument @content-handler)))) |
169 | 171 | (org.xml.sax.InputSource.)) |
170 | 172 | (javax.xml.transform.stream.StreamResult. *out*)))) |
171 | 173 |
|
|
0 commit comments