要素名で探して処理する:cxml stp - lisp-cookbook-ja/common-lisp GitHub Wiki
XML文章構築
(defparameter *doc*
(cxml:parse
"<a xmlns='http://tips.lisp-users.org/common-lisp'><b>1</b><b>1</b><b>9</b><c>2</c></a>"
(stp:make-builder)))
stp:filter-recursivelyで該当する要素をリストに抜き出してからリスト処理
(let ((elts (stp:filter-recursively (lambda (c)
(and (typep c 'stp:element)
(string= "b" (stp:local-name c))))
*doc* )))
(dolist (e elts)
(format t
"~A => ~A~%"
(stp:local-name e) (stp:string-value e))))
;-> b => 1
; b => 1
; b => 9
;
;=> NIL
stp:of-nameを利用した場合((typep c 'stp:element)(string= "b" (stp:local-name c))を一つにまとめたもの)
(let* ((ns (stp:namespace-uri (stp:document-element *doc*)))
(elts (stp:filter-recursively (stp:of-name "b" ns) *doc* )))
(dolist (e elts)
(format t
"~A => ~A~%"
(stp:local-name e) (stp:string-value e))))
;-> b => 1
; b => 1
; b => 9
;
;=> NIL
stp:do-recursivelyで、リストにはまとめず、再帰的に処理
(stp:do-recursively (e *doc*)
(when (and (typep e 'stp:element)
(string= "b" (stp:local-name e)))
(format t
"~A => ~A~%"
(stp:local-name e) (stp:string-value e))))
;-> b => 1
; b => 1
; b => 9
;
;=> NIL