RE: Re: sxml:sxml->xml

[email protected] (mike) Thu, 16 Oct 2003 23:02:51 -0400
Newsgroups gmane.lisp.scheme.ssax-sxml
Message-ID <[email protected]>
Thanks oleg, Dmitry and others.  I really appreciate the quick help.  I'll give all this a try, although it's going to take me a while to digest I think.  Thanks.

mike

[email protected] wrote:

>
>Hello!
>
>> You will get:
>> > "<*TOP*><Person
>> id='1111'><FirstName>Homer</FirstName><LastName>Simpson</LastName><EmptyElem
>> entHere/></Person></*TOP*>"
>
>That '*TOP*' shouldn't be there. Perhaps you may want to make a
>special condiction in sxml:sxml->xml to eliminate *TOP* and replace
>it with an XML declaration. Incidentally, sxml:sxml->xml has another
>problem: it doesn't sanitize bad characters in the attributes. I think
>I mentioned that to Kirill some time ago.
>
>Actually, using the stylesheet gives more flexibility, and less
>error-prone. Here's the code that takes SXML and prints it out. If you
>rather had a string, enclose the code within (with-output-to-string).
>
>(define (to-xml sxml)
>  (SRV:send-reply
>    (pre-post-order sxml
>      `((@
>      ((*default*       ; local override for attributes
>         . ,(lambda (attr-key . value)
>          (if (null? value) (list #\space attr-key "='" attr-key "'")
>            (list #\space attr-key "='" value #\')))))
>      . ,(lambda (trigger . value) (cons '@ value)))
>     (*default* . ,(lambda (tag . elems)
>             (if (and (pair? elems) (pair? (car elems))
>                   (eq? '@ (caar elems)))
>               (list #\< tag (cdar elems)
>                 (if (pair? (cdr elems)) (list  #\> (cdr elems) 
>                               "</" tag #\>)
>               "/>"))
>               (cons #\< (cons tag  
>             (if (pair? elems) 
>                   (list #\> elems "</" tag #\>) '("/>")))))))
>     (*text* . ,(let ((string->goodXML
>                (make-char-quotator
>                  '((#\< . "<") (#\> . ">")
>                 (#\& . "&") (#\" . "&quot;")
>                 (#\' . "&apos;")))))
>              (lambda (trigger str) 
>            (if (string? str) (string->goodXML str) str))))
>     (*TOP*
>       . ,(lambda (tag . elems)
>        (list
>          "<?xml version=\"1.0\"?>"
>          ;"<!DOCTYPE productlist SYSTEM \"productlist.dtd\">"
>          elems)))
>     ))))
>
>
>(to-xml '(*TOP*
>       (Person
>         (@ (id "1111"))
>         (FirstName "Homer")
>         (LastName "Simpson")
>         (EmptyElementHere))))
>
>prints the desired XML document. The code uses the bare minimum:
>SRV:send-reply, pre-post-order and make-char-quotator, all of which
>should be available (and are available in the CVS repository). I ran
>the code in Bigloo against the CVS current code.
>
>I must mention that there are many things you may want to do when
>converting SXML to XML: e.g., make the XML prettier by inserting
>newlines and spaces. That is trickier than it sounds. You can add the
>processing of PI, COMMENTs and other stuff. Namespaces offer more
>choices and more trouble. You may want to look at sxmlcnv by Kiyoka
>Nishiyama
>    http://www.netfort.gr.jp/~kiyoka/sxmlcnv/
>
>that does several of these advanced things.
>
>
>Incidentally, it's possible to turn SXML into XML without creating any
>intermediate list structure first. This greatly improves the speed and
>especially the latency, when dealing with large (order of megabytes)
>SXML documents. I've been using this approach in production for some
>time. I haven't gotten around to writing it up though.
>
>
>
>
>-------------------------------------------------------
>This SF.net email is sponsored by: SF.net Giveback Program.
>SourceForge.net hosts over 70,000 Open Source Projects.
>See the people who have HELPED US provide better services:
>Click here: http://sourceforge.net/supporters.php
>_______________________________________________
>ssax-sxml mailing list
>[email protected]
>https://lists.sourceforge.net/lists/listinfo/ssax-sxml
>

__________________________________________________________________
McAfee VirusScan Online from the Netscape Network.
Comprehensive protection for your entire computer. Get your free trial today!
http://channels.netscape.com/ns/computing/mcafee/index.jsp?promo=393397

Get AOL Instant Messenger 5.1 free of charge.  Download Now!
http://aim.aol.com/aimnew/Aim/register.adp?promo=380455


-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
SourceForge.net hosts over 70,000 Open Source Projects.
See the people who have HELPED US provide better services:
Click here: http://sourceforge.net/supporters.php