Need help with filtering elements and/or attributes
Josef Wolf
jw at raven.inka.de
Mon Jan 10 07:34:28 UTC 2022
Hello,
I am new to cxml and need some assistance to get started.
Thanks to https://common-lisp.net/project/cxml/quickstart.html, it is fairly
easy to read existing xml and write them back (almost) identical:
(defun parse-dom (file)
(cxml:parse file (cxml-dom:make-dom-builder)))
(defun serialize-dom (file dom new-extension)
(with-open-file (out (make-pathname :defaults file :type new-extension)
:direction :output
:if-exists :supersede
:element-type '(unsigned-byte 8))
(write-sequence #(#xef #xbb #xbf) out) ;; byte order mask
(dom:map-document (cxml:make-octet-stream-sink out :encoding "utf-8")
dom)))
(let ((file #p"some-file.xml"))
(serialize-dom file
(parse-dom file)
"new-xml"))
with this, I can read a file and write it back. With
diff -uw some-file.xml some-file.new-xml
I can confirm that those files are (semantically) identical.
But how do I go further? As a start, I would like to remove elements and/or
attributes while writing. From the docs, I seem to understand that this can be
done using sinks. But I just can't figure how to create my custom sink to do
the filtering. And three das googling did not reveal any
examples/howtos/tutorials.
Can somebody provide an example how to create a custom sink and which methods
can be specialized to do such filtering?
Thanx!
--
Josef Wolf
jw at raven.inka.de
More information about the cxml-devel
mailing list