要素名で探して処理する: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
⚠️ **GitHub.com Fallback** ⚠️