2009年2月3日火曜日

XMLを扱う (その17) [Common Lisp]


現状でのまとめ。STP。

javaのXOMにインスパイアされたもの。

STPの生成とSerialize。

---
(defparameter *stp-ex* (cxml:parse #p"example-100.xml" (stp:make-builder)))
(stp:serialize *stp-ex* (cxml:make-character-stream-sink *standard-output*))
---

データ構造はDOMに似ている。nodeを基本とする。

map-recursively, do-recursively, find-recursively,
filter-recursively

などの再帰関数が用意されている。

---
CL-USER(21): (stp:filter-recursively (stp:of-name "bar") *stp-ex*)
(#.(CXML-STP:ELEMENT
#| :PARENT of type ELEMENT |#
:ATTRIBUTES '(#.(CXML-STP:ATTRIBUTE
#| :PARENT of type ELEMENT |#
:VALUE "default"
:LOCAL-NAME "space"
:NAMESPACE-PREFIX "xml"
:NAMESPACE-URI "http://www.w3.org/XML/1998/namespace"))
:BASE-URI "file://+/Users/aka/scratch/cl/xml/example-100.xml"
:CHILDREN '(#.(CXML-STP:TEXT #| :PARENT of type ELEMENT |# :DATA " "))
:LOCAL-NAME "bar")
#.(CXML-STP:ELEMENT
#| :PARENT of type ELEMENT |#
:ATTRIBUTES '(#.(CXML-STP:ATTRIBUTE
#| :PARENT of type ELEMENT |#
:VALUE "preserve"
:LOCAL-NAME "space"
:NAMESPACE-PREFIX "xml"
:NAMESPACE-URI "http://www.w3.org/XML/1998/namespace"))
:BASE-URI "file://+/Users/aka/scratch/cl/xml/example-100.xml"
:CHILDREN '(#.(CXML-STP:TEXT #| :PARENT of type ELEMENT |# :DATA " "))
:LOCAL-NAME "bar"))
CL-USER(22):
---

で、このあと、CLっぽいAPIが続く、また、STPの構成物(element他)を生
成したり操作するAPIが続く。まあ、これらは難しくないのではしょる。

STPからDOMやXMLSに変換できる。

---
(stp:serialize *stp-ex* (cxml-dom:make-dom-builder))
(stp:serialize *stp-ex* (cxml-xmls:make-xmls-builder))
---

まさにDOMの代替物という感じであった。これ以上は実際に使うときにや
ることにする。

次回はcxmlにおけるschemaとvalidatorの取り扱いを確認する。
こつこつ。

0 件のコメント: