[ssax-sxml] VXML parser
Brought to you by:
oleg
From: <ol...@po...> - 2001-10-06 02:03:46
|
Hello! > Similarly, is there any VXML parser to produce SXML > data structure from VXML document? Do your refer to VoiceXML or Visual XML? In any case, both are XML formats. A SSAX parser can handle both of them. Or the Expat parser -- you _can_ convert XML to SXML with Expat as well, although SSAX is probably a bit more convenient. For one thing, constructing lists is far easier in Scheme. For another, when using Expat, _you_ must be able to determine the end of your document, and tell Expat about it. In contrast, the SSAX parser stops when it has finished reading an element. The SSAX parser tells you when it has finished. This fact makes SSAX suitable for parsing XML documents received through blocking pipes (such as TCP/IP pipes), and for parsing a (non-delimited) sequence of XML documents. > Also, will the following code unparse the SXML > structure back to VXML? > (SRV:send-reply > (post-order tree1 > `((@ ((*default* ; local override for attrs > . ,(lambda (attr-key value) > ((enattr attr-key) value)))) > . ,(lambda (trigger value) > (list '@ value))) > (*default* . ,(lambda (tag elems) > (apply (entag tag) elems))) > (*text* . ,(lambda (trigger str) str)) > )) ) Correct. The code will unparse any SXML into XML (given appropriate definition for enattr and entag functions, see below). To be more precise however, the last line should read (*text* . ,(lambda (trigger str) (beautify str))) where (define special-chars ((#\< . "<") (#\> . ">") (#\& . "&") (#\" . """) (#\' . "'") (#\return . " "))) (define (quotator str) (make-char-quotator special-chars)) (define (beautify x) (cond ((string? x) (quotator x)) ((assq x special-chars) => cdr) (else x))) (define (entag tag) (lambda elems (if (and (pair? elems) (pair? (car elems)) (eq? '@ (caar elems))) (list #\< tag (cdar elems) (if (null? (cdr elems)) "/>" (list #\> (cdr elems) "</" tag #\>))) (list #\< tag (if (null? elems) "/>" (list #\> elems "</" tag #\>)))))) (define (enattr attr-key) (lambda (value) (if (null? value) (list #\space attr-key "=\"" attr-key #\") (list #\space attr-key "=\"" value #\")))) BTW, the function make-char-quotator is in util.scm (see the CVS repository). Cheers, Oleg |