REBOL [ Title: "XML to RebXML Converter" Date: 08-Nov-2005 Version: 1.2.0 File: %xml2rebxml.r Author: "John Niclasen" Rights: {Copyright © John Niclasen, NicomSoft 2005} Purpose: {Convert XML to RebXML block structure.} Comment: { Build from xml2txt.r and XML 1.0 DTD from www.w3.org. } History: [ 1.2.0 [08-11-2005 JN {Added suppport for " and ' in Attribute. Added preservation of comments.}] 1.1.2 [06-11-2005 JN {Fixed bug with multi comments.}] 1.1.1 [24-02-2005 JN {Changed EmptyElemTag from # to a slash: /}] 1.1.0 [23-02-2005 JN {Added support for namespace-tags. Changed EmptyElemTag from "" to a number sign: #}] 1.0.1 [31-01-2005 JN {Added "load mold" before returning output. Added replacements for ">", "<" and "&".}] 1.0.0 [25-01-2005 JN {Created.}] ] library: [ level: 'intermediate platform: 'all type: 'tool domain: [markup parse xml] tested-under: none support: none license: 'BSD see-also: "rebxml2xml.r" ] ] output: make block! 1000 context [ preserve-comments: false lit-slash: to-lit-word "/" block-begin: to word! "[" block-end: to word! "]" attrs: make block! 20 ;output: make block! 1000 input-str: none att-data: data: temp: tag-name: att-name: enc-name: c: none ;-- Character Sets joinset: func [cset chars] [insert copy cset chars] diffset: func [cset chars] [remove/part copy cset chars] space: charset [#"^(09)" #"^(0A)" #"^(0D)" #" "] char: charset [#"^(09)" #"^(0A)" #"^(0D)" #" " - #"^(FF)"] Letter: charset [ #"A" - #"Z" #"a" - #"z" #"^(C0)" - #"^(D6)" #"^(D8)" - #"^(F6)" #"^(F8)" - #"^(FF)" ] ;Digit: charset [#"0" - #"9"] alpha-num: joinset Letter "0123456789" ; need to allow: Digit name-first: joinset Letter "_:" NameChar: joinset alpha-num ".-_:" data-chars: diffset char "<" ; "&<" Name: [name-first any NameChar] S: [some space] ;-- XML Rules document: [prolog element to end] AttValue: ["'" copy att-data to "'" skip | {"} copy att-data to {"} skip] Comment: ["" ( if preserve-comments [ insert tail output join "