From 2eec88675ad262cb0e7a4c3ef92a5c40702859f6 Mon Sep 17 00:00:00 2001
From: dlichteblau
CXML implements a namespace-aware,
- validating SAX-like XML 1.0
parser as well as the DOM Level 2 Core
- interfaces.
+ interfaces. Two parser interfaces are offered, one SAX-like, the
+ other similar to StAX.
rel-2006-xx-yy rel-2007-xx-yy
+ The Klacks parser provides an alternative parsing interface,
+ similar in concept to Java's Streaming API for
+ XML (StAX).
+
+ It implements a streaming, "pull-based" API. This is different
+ from SAX, which is a "push-based" model.
+
+ Klacks is implemented using the same code base as the SAX parser
+ and has the same parsing characteristics (validation, namespace
+ support, entity resolution) while offering a more flexible interface
+ than SAX.
+
+ The following example illustrates creation of a klacks source,
+ use of the consume function to read individual events,
+ and shows some of the most common event types.
+
+ To parse using Klacks, create an XML source first.
+
+ Recent Changes
-
+
Klacks parser
+ Example
+ * (defparameter *source* (cxml:make-source "<example>text</example>"))
+*SOURCE*
+* (klacks:consume *source*)
+:START-DOCUMENT
+* (klacks:consume *source*)
+:START-ELEMENT
+NIL ;namespace URI
+"example" ;local name
+"example" ;qualified name
+* (klacks:consume *source*)
+:CHARACTERS
+"text"
+* (klacks:consume *source*)
+:END-ELEMENT
+NIL
+"example"
+"example"
+* (klacks:consume *source*)
+:END-DOCUMENT
+* (klacks:consume *source*)
+NIL
+
+ Klacks sources
+
+ Exact behaviour depends on input, which can + be one of the following types: +
++ Closing streams: Sources can refer to Lisp streams that + need to be closed after parsing. This includes a stream passed + explicitly as input, a stream created implicitly for the + pathname case, as well as any streams created + automatically for external parsed entities referred to by the + document. +
++ All these stream get closed automatically if end of file is + reached normally. Use klacks:close-source or + klacks:with-open-source to ensure that the streams get + closed otherwise. +
++ Keyword arguments have the same meaning as with the SAX parser, + please refer to the documentation of parse-file for more information: +
++ In addition, the following argument is for types of input + other than pathname: +
++ Events are read from the stream using the following functions: +
++
=> :start-document
+ or => :start-document, version, encoding, standalonep
+ or => :dtd, name, public-id, system-id
+ or => :start-element, uri, lname, qname
+ or => :end-element, uri, lname, qname
+ or => :characters, data
+ or => :processing-instruction, target, data
+ or => :comment, data
+ or => :end-document, data
+ or => nil
+
+ peek returns the current event's key and main values. +
++
+ Return the same values peek would, and in addition + advance the source forward to the next event. +
++
+ Like peek, but return only the values, not the key. +
++
+ If the current event is :start-element or :end-element, return the + corresponding value. Else, signal an error. +
++
+ If the current event is :characters, return the character data + value. Else, signal an error. +
++
+ If the current event is :characters, determine whether the data was + specified using a CDATA section in the source document. Else, + signal an error. +
++
+ Call fn for each attribute of the current start tag in + turn, and pass the following values as arguments to the function: +
+ Return a list of SAX attribute structures for the current start tag. + Only valid for :start-element. +
+ ++
+
* (cxml:parse-file "example.xml" (cxml-xmls:make-xmls-builder))
("test" (("a" "b")) ("child" NIL))
+
+ Use klacks to read events from the parser incrementally. The + following example looks only for :start-element and :end-element + events and prints them (read more):
+* (klacks:with-open-source
+ (s (cxml:make-source #p"example.xml"))
+ (loop
+ for key = (klacks:peek s)
+ while key
+ do
+ (case key
+ (:start-element
+ (format t "~A {" (klacks:current-qname s)))
+ (:end-element
+ (format t "}")))
+ (klacks:consume s)))
+test {child {}}