rebol[
   Title:   "XML node parser"
   Date:    20-Jul-2003
   Version: 0.0.1
   File:    %RblxelParser.r
   Home:    http://www.rebol.com/
   Author:  "daniel murrill"
   Email:   drebol@mindspring.com
   Owner:   "daniel murrill"
   Rights:  "Copyright (C) daniel murrill 2000"
   Language: 'English
   Charset: 'ANSI
   Purpose: {
      To parse single xhtml & xml nodes
       for there values.

   }

   Comment: {
     The purpose for this script is to parse well
     formed xml or xhtml, but  can be
     used for css and html.  This is only the xml
     node functions (i.e. *xml node object).  This
     script has been taken from a larger
     portion thats used in a Rebol browser.

    If desired, you can email me a copy of these
    functions that have been better scripted
    or post to the Library, i'll see about swapping
    it for my rusty functions, but please base it off
    the existing functions.
    Be carefull, using *copy/part (find blah blah)(find blah blah)*
    does not behave all the time when putting *getnode... functions
    in larger that dynamically creates portions from itself.
    Or maybe it's just me.
   }

    Library: [
        level: 'beginner
        platform: none
        type: []
        domain: [dialects html markup parse xml]
        tested-under: none
        support: none
        license: none
        see-also: none
    ]
]
xml: {


Madirth
1202 Madison
Balam Na Resort Balam Resort "names" "Cabo" "Baja" Resort Balam "24" "1968"
back jump
} getnodename: func [tag] [ heads: to-string copy tag insert heads "<" findtail: parse/all tag " " tails: findtail/1 tails: to-tag join "/" tails parse xml [ to heads copy node to ">" (heads: to-string reduce [heads">"]) thru ">" copy text to tails (text: to-string text) (parse node [ some [thru " " copy attname to "=" thru "=" copy attvalue to ">" ] skip ] print [heads text tails]) ] ] getnodevalue: func [txt] [ text: txt if find xml text [ parse xml [ thru "<" copy htag to txt copy text thru txt to ""] sethead: copy gethead hds: parse/all sethead " " gettail: copy hds/1 heads: copy setag tails: to-tag copy gettail insert tails "/" parse setag [ thru " " copy attname to "=" thru "=" copy attvalue to ">" ] ] node: to-string reduce [heads text tails] print node ] getattribute: func [attrv] [ parse xml [ to "<" copy heads to attrv copy attribute to ">" thru ">" copy text to "<" ] hds: find/last heads "<" parse xml [ to hds copy heads thru ">" ] parse hds [ thru "<" copy gettail to " " (trim/all gettail) ] tails: to-tag copy gettail insert tails "/" parse heads [ thru " " copy attname to "=" thru "=" copy attvalue to end ] node: to-string reduce [heads text tails] print node ] setnode: func [newhead] [ findhead: to-string copy newhead insert findhead "<" size: length? heads findtail: parse/all findhead " " settail: copy findtail/1 remove settail settail/1 insert settail "/" newtail: to-tag settail either heads = "" [] [parse xml [to heads mark: (remove/part mark size mark: insert mark findhead) :mark] replace xml tails newtail parse newtail [ some [ thru " " copy attname to "=" thru "=" copy attvalue to end ] skip ] ] ] setnodevalue: func [newtext] [ size: length? text parse xml [ to text mark: (remove/part mark size mark: insert mark newtext) :mark ] ] setattribute: func [attrvar attrvalue] [ hds: copy heads replace hds attname attrvar replace hds attvalue attrvalue replace xml heads to-string reduce [hds ">"] attname: attrvar attname: attrvar attvalue: attrvalue ] getchildnode: func [] [parse xml [ to heads copy childnode to tails ( replace childnode heads "" remove childnode ">" replace childnode tails "" parse childnode [ to "<" copy heads to ">" thru ">" copy text to "<" (text: to-string text) ] hds: parse/all heads " " gettail: to-string hds/1 gettail: remove head gettail tails: to-tag copy gettail insert tails "/" node: to-string reduce [heads ">" text tails] print node)] ] getnextsibling: func [] [ oldnode: copy/part (find xml text) (find/last xml "" copy text to "<" ] parse nhead [ thru " " copy attributename to "=" thru "=" copy attributevalue to ">" ] node: to-string reduce [heads text tails] print node ] [print reduce [ heads "has no sibling...." ] ] ] createnode: func [newnode] [ tailnode: newnode parse xml [ to text thru text to tails thru tails objtail: to "<" objtext: (change/part objtail reduce [newline newnode newline] :objtext) (parse tailnode [some [thru ">" copy text to "