diff options
Diffstat (limited to 'xsd/doc/cxx/tree/manual')
| -rw-r--r-- | xsd/doc/cxx/tree/manual/cxx-tree-manual.pdf | bin | 0 -> 221921 bytes | |||
| -rw-r--r-- | xsd/doc/cxx/tree/manual/cxx-tree-manual.ps | 7382 | ||||
| -rw-r--r-- | xsd/doc/cxx/tree/manual/index.xhtml | 6822 | ||||
| -rw-r--r-- | xsd/doc/cxx/tree/manual/makefile | 54 | ||||
| -rw-r--r-- | xsd/doc/cxx/tree/manual/manual.html2ps | 66 | 
5 files changed, 14324 insertions, 0 deletions
diff --git a/xsd/doc/cxx/tree/manual/cxx-tree-manual.pdf b/xsd/doc/cxx/tree/manual/cxx-tree-manual.pdf Binary files differnew file mode 100644 index 0000000..73131a3 --- /dev/null +++ b/xsd/doc/cxx/tree/manual/cxx-tree-manual.pdf diff --git a/xsd/doc/cxx/tree/manual/cxx-tree-manual.ps b/xsd/doc/cxx/tree/manual/cxx-tree-manual.ps new file mode 100644 index 0000000..38335e9 --- /dev/null +++ b/xsd/doc/cxx/tree/manual/cxx-tree-manual.ps @@ -0,0 +1,7382 @@ +%!PS +%%Title: C++/Tree Mapping User Manual +%%Creator: html2ps version 1.0 beta7 +%%EndComments +save +2000 dict begin +/d {bind def} bind def +/D {def} d +/t true D +/f false D +/FL [/Times-Roman +/Times-Italic +/Times-Bold +/Times-BoldItalic +/Courier +/Courier-Oblique +/Courier-Bold +/Courier-BoldOblique +/Helvetica +/Helvetica-Oblique +/Helvetica-Bold +/Helvetica-BoldOblique] D +/WF t D +/WI 0 D +/F 1 D +/IW 471 F div D +/IL 621 F div D +/PS 791 D +/EF [0 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 2 2] D +/EZ [12 10 19 17 15 13 12 11 12 12 12 12 12 12 12 12 12 12 12 12 12 12 8 8] D +/Ey [0 0 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] D +/EG [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1] D +/Tm [1 1 0.8 0.8 0.8 0.8 0.8 0.8 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1.3 0 0] D +/Bm [1 1 0.5 0.5 0.5 0.5 0.5 0.5 0 0 0 0 0 0 0.5 1 1 1 1 0 0 1 0 0] D +/Lm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 0 0 2 0 0 0] D +/Rm [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0] D +/EU [-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 0] D +/NO f D +/YY [[{()}{ h }][{ h }{()}][{()}{()}]] D +/ZZ [[{ (July 2014) }{ Pn }][{ Pn }{ (July 2014) }][{ Ti(, v)join ME 0 get join }{ Ti(, v)join ME 0 get join }]] D +/Ts EZ 0 get D +/TU f D +/Xp t D +/AU f D +/SN 0 D +/Cf t D +/Tp t D +/Fe f D +/TI 2 Ts mul D +/Fm 14 D +/xL 71 D +/xR 71 D +/yL 706 D +/yR 706 D +/Wl 471 F div D +/Wr 471 F div D +/hL 621 F div D +/hR 621 F div D +/FE {newpath Fm neg Fm M CP BB IW Fm add Fm L IW Fm add IL Fm add neg L CP BB + Fm neg IL Fm add neg L closepath} D +/LA {PM 0 eq{/IW Wl D /IL hL D}{/IW Wr D /IL hR D}ie /W IW D /LL W D /LS W D + TU PM 0 eq and{IW 56 F div add SA{Sf div}if 0 translate} + {PM 0 eq{xL yL}{xR yR}ie translate F SA{Sf mul}if dup scale + CS CF FS Cf{CA CL get VC}if /Bb f D}ie 0 0 M + TF not Tc or {Cf{gsave SA{1 Sf div dup scale}if Cb VC FE fill grestore}if}if}D +/Pi 0 Ts mul D +/SG [0.8 1 1] D +/Ab 15 D +/J 0 D +/Tc t D +/NH 6 D +/Nf f D +/Pa f D +/LH 1.2 D +/XR f D +/Xr {/pN E D ( [p ) WB pN WB (] )WB} D +/Db [16#FF 16#FF 16#FF] D +/Dt [16#00 16#00 16#00] D +/eA f D +/Fi f D +/bT f D +/Lc t D +/Dl [16#00 16#00 16#00] D +/LX f D +/Br 0.25 D +/IA ([IMAGE]) D +/DS {/PF f D()WB NL NP()pop RC ZF} D +/Gb f D +/Mb t D +/Hc [16#00 16#00 16#00] D +/Bl 3 D +/MI -15.6 D +/DX (DRAFT) D +/Di 0 D +/Tt 113.385826771654 D +/Th { ( +) 2 Al()BR ( +  ) 0 1 -1 H()4 FZ (C++/Tree Mapping User Manual) ES()EH ( +  ) 0 1 -1 H ( ) EH ( +  ) 0 1 -1 H ( ) EH ( +  ) 0 1 -1 H ( ) EH ( +  ) 0 1 -1 H ( ) EH ( +  ) 0 1 -1 H ( ) EH ( +  ) 0 1 -1 H ( ) EH ( +  ) 0 1 -1 H ( ) EH ( +) Ea()BR ( +  ) 0 P (Revision ) ME 0 get join(     July 2014)join EP ( +  ) 0 P (Copyright © 2005-2014 CODE SYNTHESIS TOOLS CC) EP ( + +  ) 0 P (Permission is granted to copy, distribute and/or modify this +     document under the terms of the +     ) R0 2 A (GNU Free +     Documentation License, version 1.2) EA (; with no Invariant Sections, +     no Front-Cover Texts and no Back-Cover Texts. +  ) EP ( + +  ) 0 P (This document is available in the following formats: +     ) R1 2 A (XHTML) EA (, +     ) R2 2 A (PDF) EA (, and +     ) R3 2 A (PostScript) EA (.) EP()} D +/tH {()0 1 -1 H (Table of Contents) EH()} D +/FD 2 D +/Dy 2 D +/cD [16#F0 16#F0 16#F0] D +/FW 0.6 D +/FU [16#00 16#00 16#00] D +/ET {/RM f D /A0 3 D /PN SN D /OU t D /Ou t D /W IW D /LL W D D1 + Ms not TP and{Ip}if /TF f D} D + +%-- End of variable part -- +/MySymbol 10 dict dup begin + /FontType 3 D /FontMatrix [.001 0 0 .001 0 0 ] D /FontBBox [25 -10 600 600] D + /Encoding 256 array D 0 1 255{Encoding exch /.notdef put}for + Encoding (e) 0 get /euro put + /Metrics 2 dict D Metrics begin +  /.notdef 0 D +  /euro 651 D + end + /BBox 2 dict D BBox begin +  /.notdef [0 0 0 0] D +  /euro [25 -10 600 600] D + end + /CharacterDefs 2 dict D CharacterDefs begin +  /.notdef {} D +  /euro{newpath 114 600 moveto 631 600 lineto 464 200 lineto 573 200 lineto +   573 0 lineto -94 0 lineto 31 300 lineto -10 300 lineto closepath clip +   50 setlinewidth newpath 656 300 moveto 381 300 275 0 360 arc stroke +   -19 350 moveto 600 0 rlineto -19 250 moveto 600 0 rlineto stroke}d + end + /BuildChar{0 begin +  /char E D /fontdict E D /charname fontdict /Encoding get char get D +  fontdict begin +   Metrics charname get 0 BBox charname get aload pop setcachedevice +   CharacterDefs charname get exec +  end + end}D + /BuildChar load 0 3 dict put /UniqueID 1 D +end +definefont pop + +/Cd {aload length 2 idiv dup dict begin {D} repeat currentdict end} D +/EX {EC cvx exec} D +/DU {} d +/BB {pop pop}d +/ie {ifelse} d +/E {exch} d +/M {moveto} d +/R {rmoveto} d +/L {lineto} d +/RL {rlineto} d +/CP {currentpoint} d +/SW {stringwidth} d +/GI {getinterval} d +/PI {putinterval} d +/Sg {setgray} d +/LW {setlinewidth} d +/S {dup () ne OU and{0 Co R AT 3 eq LB and HF not and A1 0 ne A2 0 ne or and + {A2 0 32 A1 0 6 -1 roll awidthshow}{show}ie 0 Co neg R}{pop}ie + OU PH 3 eq or{/Ms t D}if} D +/U {OU{gsave CP currentfont /FontInfo get /UnderlinePosition get + 0 E currentfont /FontMatrix get dtransform E pop add newpath M dup SW pop + CJ 0 RL stroke grestore}if} D +/B {OU Br 0 gt and{CP Ts neg Ts .33 mul R gsave 0 Sg + CP newpath Ts Br mul 0 360 arc closepath UI 2 mod 0 eq{stroke}{fill}ie + grestore M CP E Ts Br 1 add mul sub E BB /Ms t D}if}D +/NP {Ms TP not or PA and OU and{TP{OR}if f1{mF k2 /mF E D /YC 0 D}if + TP TU not PM 0 eq or and{showpage}if DU Ip TE not{LA}if 0.6 LW + /CI 0 D /TP t D /Hs f D /hl 6 D /Hv 6 D /HI hi D /Ms f D}if Bs XO BO M} D +/Np {LE sub CP E pop gt PL 0 eq and{NP}if}D +/Ip {/PN PN 1 add D /Pn RM{1}{4}ie PN Ns D /PM PN SN sub 2 mod D} D +/GP {E dup 3 -1 roll get PN 1 add 2 mod get dup type /integertype eq + {get 0 get}{E pop}ie}d +/Fc {dup 2 GP exec SW pop /S1 E D dup 1 GP exec SW pop /S2 E D 0 GP exec SW + pop /S3 E D S1 0 gt{S2 2 mul S1 add S3 2 mul S1 add 2 copy lt{E}if pop}{0}ie + S2 S3 add 2 copy lt{E}if pop IW .9 mul div dup 1 gt{1 E div}{pop 1}ie}D +/OR {Df{Sd}if tp not{gsave SA{1 Sf div dup scale}if Fe{Cf{FU VC}if FW LW + 1 setlinejoin FE stroke}if /YO {60 F div dup 40 gt{pop 40}if}D /cs CS D + /cf CF D /CF 0 D /pf PF D /PF f D /Fn FN D /At AT D /AT 0 D /FN EF Hf 1 add + get D Fz Fs FS ZZ Fc Fz mul Fs FS EU Hf 1 add get dup type /arraytype eq + Cf and{VC}{pop 0 Sg}ie IW IL neg YO sub M ZZ 1 GP exec dup SW pop neg 0 R Sh + 0 IL neg YO sub M ZZ 0 GP exec Sh ZZ 2 GP exec dup SW pop IW E sub 2 div + IL neg YO sub M Sh Fz Fs FS NO{/AW IW Pn SW pop sub D AW 2 div IL neg YO sub + S1 0 gt S2 AW .45 mul gt or S3 AW .45 mul gt or{Fz 2 mul sub}if M Pn Sh}if + EU Hf get dup type /arraytype eq Cf and{VC}{pop 0 Sg}ie YY Fc /FN EF Hf get D + Hz mul HS FS IW YO M YY 1 GP exec dup SW pop neg 0 R Sh 0 YO M YY 0 GP exec Sh + YY 2 GP exec dup SW pop IW E sub 2 div YO M Sh /FN Fn D /AT At D t Pb XO SZ + SL get neg R /PF pf D grestore /CF 0 D cs cf FS}if}D +/Sh {dup () ne{CP Hz 4 div sub BB show CP CS add BB}{pop}ie}D +/Pb {/OU E D /Ou OU D /PB t D 0 0 M Ba{/Sa save D /BP t D /Fl t D RC /PL 0 D + /PH 0 D /W IW D /LE IL .7 mul D /EO 0 D SI ZF /YA 0 D /BO 0 D /C1 () D + BA 0 Ts neg R Bb{Xl Yl Xh Yh}if Bb CP Sa restore M + {/Yh E D /Xh E D /Yl E D /Xl E D}if /Fl t D}if + BL /OU t D /HM f D /Ou t D /PB f D} D +/Bs {/BP Ba not D}D +/reencodeISO { + dup dup findfont dup length dict begin{1 index /FID ne{D}{pop pop}ie}forall + /Encoding ISOLatin1Encoding D currentdict end definefont} D +/ISOLatin1Encoding [ +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright +/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash +/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon +/less/equal/greater/question/at/A/B/C/D/E/F/G/H/I/J/K/L/M/N +/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash/bracketright +/asciicircum/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m +/n/o/p/q/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/asciitilde +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef +/.notdef/space/exclamdown/cent/sterling/currency/yen/brokenbar +/section/dieresis/copyright/ordfeminine/guillemotleft/logicalnot +/hyphen/registered/macron/degree/plusminus/twosuperior/threesuperior +/acute/mu/paragraph/periodcentered/cedilla/onesuperior/ordmasculine +/guillemotright/onequarter/onehalf/threequarters/questiondown +/Agrave/Aacute/Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla +/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute/Icircumflex +/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis +/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute +/Thorn/germandbls/agrave/aacute/acircumflex/atilde/adieresis +/aring/ae/ccedilla/egrave/eacute/ecircumflex/edieresis/igrave +/iacute/icircumflex/idieresis/eth/ntilde/ograve/oacute/ocircumflex +/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex/udieresis +/yacute/thorn/ydieresis +] D +[128/backslash 129/parenleft 130/parenright 141/circumflex 142/tilde +143/perthousand 144/dagger 145/daggerdbl 146/Ydieresis 147/scaron 148/Scaron +149/oe 150/OE 151/guilsinglleft 152/guilsinglright 153/quotesinglbase +154/quotedblbase 155/quotedblleft 156/quotedblright 157/endash 158/emdash +159/trademark] +aload length 2 idiv 1 1 3 -1 roll{pop ISOLatin1Encoding 3 1 roll put}for +/colorimage where{pop}{ + /colorimage { +  pop pop /Pr E D {/Cv Pr D /Gr Cv length 3 idiv string D 0 1 Gr length 1 sub +   {Gr E dup /i E 3 mul D Cv i get 0.299 mul Cv i 1 add get 0.587 mul add +    Cv i 2 add get 0.114 mul add cvi put}for Gr} image} D +}ie +/pdfmark where{pop}{userdict /pdfmark /cleartomark load put}ie +WF{FL{reencodeISO D}forall}{4 1 FL length 1 sub{FL E get reencodeISO D}for}ie +/Symbol dup dup findfont dup length dict begin + {1 index /FID ne{D}{pop pop}ie}forall /Encoding [Encoding aload pop] + dup 128 /therefore put D currentdict end definefont D + +/SF {/CS E D SZ SL CS put FO SL FN put /YI CS LH neg mul D dup ST cvs ( ) join + CS ST cvs join C1 E join ( NF ) join /C1 E D CS NF /Wf WF FN 0 gt or D + /BW Wf{( ) SW pop}{0}ie D}D +/NF {/cS E D /cF E D cF 0 ge{FL cF get}{cF -1 eq{/Symbol}{/MySymbol}ie}ie + findfont cS scalefont setfont} D +/FS {CF or /CF E D FR SL CF put CF CF 0 ge{FN 4 mul add}if E SF} D +/PC {SH /BP f D fin not GL not and{NL}if /HM t D /LL LS D} D +/BS {/TX E D Wf{/fin f D /CW 0 D /LK 0 D /SC 0 D + /RT TX D {RT ( ) search{/NW E D pop /RT E D /WH NW SW pop D CW WH add LL gt + {TX SC LK SC sub 1 sub NN GI GL{SH cF cS OC + 2 copy cS ne E cF ne or{NF}{pop pop}ie}{PC /CW WH BW add D}ie + /SC LK D} + {GL{JC}if + /CW CW WH add BW add D /HM t D}ie /GL f D /Ph f D + /LK LK NW length 1 add add D}{pop exit}ie}loop + /fin t D TX SC LK SC sub GI SH RT () ne{GL not{CC}if}if + /LC TX length D /WH RT SW pop D CW WH add Hy{HC SW pop add}if LL gt + {RT GL{SH cF cS OC 2 copy cS ne E cF ne or{NF}{pop pop}ie + Hy{/Ph t D}if /LL LS D}{NL /LL LS D SH}ie} + {RT PC Hy{CC}if /Ph Ph Hy or D}ie RT () ne{/GL t D /HM t D}if} + {TX SW pop LL le{TX SH}{/NW () D 0 2 TX length 1 sub + {/CW E D TX 0 CW GI dup SW pop LL gt{pop NW SH /HM t D NL/LL W XO sub MR sub D + /CW CW 2 sub NN D /TX TX CW TX length CW sub GI D TX BS exit} + {/NW E D}ie}for}ie}ie /HM t D}D +/CC {C0 length 0 gt{JC}if /C0 [C1 L1 YA YB Mf NS NB TB AF Bw] D + /C1 () D /L0 L1 D /YA 0 D /YB 0 D /Mf 0 D /NS 0 D /NB 0 D}D +/JC {C0 aload length 0 gt{pop pop pop NB add /NB E D NS add /NS E D + dup Mf gt{/Mf E D}{pop}ie dup YB gt{/YB E D}{pop}ie + dup YA gt{/YA E D}{pop}ie pop C1 join /C1 E D /C0 [] D}if}D +/OC {C0 length 0 gt{C1 L1 L0 sub YA YB Mf NS NB TB AF Bw GL C0 aload pop + /Bw E D /AF E D /TB E D /NB E D /NS E D /Mf E D /YB E D /YA E D /C0 [] D + /L1 E D /C1 E D Ph{HC SH}if NL /GL E D /Bw E D /AF E D /TB E D /NB E D /NS E D + /Mf E D /YB E D /YA E D /L1 E D /LL W L1 sub XO sub MR sub WH sub D /CW 0 D + C1 E join /C1 E D}if}D +/BT {/LB t D dup length string copy RS dup dup () ne E ( ) ne and + {/CI 0 D /LS LL D /LL W L1 sub XO sub MR sub D BS} + {dup ( ) eq{/GL f D}if dup () eq L1 0 eq or{pop}{SH /BP f D /Ph f D}ie}ie + /LB f D} D +/BL {CP E pop XO E M} D +/NL {JC /GL f D /SK W XO sub MR sub L1 sub TB{Bw add}if D + /YA LF{Mf HM Fl not and PF or{LH mul}if}{0 /LF t D}ie YA 2 copy lt{E}if pop D + C1 () ne{/FB YB Mf SA{Sf mul}if 4 div 2 copy lt{E}if pop D}if Fl{/Ya YA D}if + CP E pop YA sub YB sub LE neg lt Fl not and PB not and{NP}if NT TL BL + OU PF not and PB or{/RE L1 TB{Bw sub}if + W XO sub MR sub div YA YB add LE BO add div 2 copy lt{E}if pop D + RE 1 gt{BL 1 RE div dup scale}if}if + AT 2 le{SK AT mul 2 div YA neg R}if + AT 3 eq{0 YA neg R TB{/NB NB 1 sub D /NS NS 1 sub D}if /NB NB 1 sub NN D + /A3 NS 6 mul NB add D NS NB add 0 eq +  {/A1 0 D /A2 0 D} +  {NS 0 eq{/A1 SK NB div dup J gt{pop 0}if D /A2 0 D}{J A3 mul SK lt +   {/A1 J D /A2 SK J NB mul sub NS div dup Ab gt{/A1 0 D pop 0}if D} +   {/A1 SK A3 div D /A2 A1 6 mul D}ie}ie}ie /A1 A1 NN D /A2 A2 NN D}if + AT 4 eq{0 YA neg R PH 2 le{PD 0 lt{/PD L1 D}if PD M1 gt{/M1 PD D}if + L1 PD sub M2 gt{/M2 L1 PD sub D}if}{DV ID 1 sub get 0 ge{Lo 0 R}if}ie}if + F0 cF ne Cs cS ne or{F0 Cs NF}if + /ms Ms D /Ms f D CP FB sub + C1 cvx exec XO EO sub L1 add TB{BW sub}if dup LM gt{/LM E D}{pop}ie + PH 0 eq PH 4 eq or Ms and{HF not{/PO t D /AH t D}if + BB CP YA add E AT 3 eq LB and{A1 sub}if TB{BW sub}if E BB} + {pop pop}ie Ms HM PH 3 eq and or{/BP f D /Fl f D}if + /Lo 0 D /L1 0 D /F0 cF D /Cs cS D BP not{0 YB NN neg R}if + OU f1 and mF not and{k2 /f1 f D}if + OU PF not and PB or{RE 1 gt{RE dup scale}if}if /Ms ms Ms or D + /C1 AF{(Cp )}{()}ie D /YA 0 D /YB 0 D BL + AT 4 eq LB not and PH 3 ge and + {ID DV length lt{DV ID get dup 0 ge{DO E sub /Lo E D /L1 Lo D}{pop}ie + /ID ID 1 add D}if}if /T t D CD{/LN LN 1 add D PD}if + /PD -1 D /NS 0 D /NB 0 D /TB f D /Ph f D /Mf 0 D /HM f D} D +/RS {/TM E D /CN 0 D TM{10 eq{TM CN ( ) PI}if /CN CN 1 add D}forall + /CN 0 D /BK HM EN and{0}{1}ie D TM + {dup 32 ne{TM CN 3 2 roll put /CN CN 1 add D /BK 0 D} + {pop BK 0 eq{TM CN 32 put /CN CN 1 add D}if /BK 1 D}ie}forall + TM 0 CN GI dup dup () ne E ( ) ne and + {dup CN 1 sub get 32 eq{/EN f D}{/EN t D}ie}if} D +/join {2 copy length E length add string dup 4 2 roll 2 index 0 3 index + PI E length E PI}d +/WR {(\n) search{dup () ne BP not or + {Li 4 le CP E pop YI Li mul add LE add 0 lt and PL 0 eq and{NP}if + SH NL pop /Li Li 1 sub D WR}{pop pop WR}ie}{SH}ie /CI 0 D /BP f D} D +/SH {dup dup () ne E ( ) ne and PF or CS Mf gt and{/Mf CS D}if + T not Wf and{( ) E join /T t D}if dup BP{/MF CS D}if + AT 3 eq{2 copy length dup 0 gt{/NB E NB add D + {( ) search{/NS NS 1 add D pop pop}{pop exit}ie}loop}{pop pop}ie}if + CD PD 0 lt and{dup DC search{SW pop /PD E L1 add D pop pop}{pop}ie}if + 0 Np dup SW pop L1 add /L1 E D dup () ne + {C1 (\() join E join (\)) join AU AF and UF or Wf and{( U ) join}if + sF{( s ) join}if ( S ) join + /C1 E D dup length 1 sub get 32 eq /TB E D /Bw BW D}{pop pop}ie} D +/BG {AI LG BC add add 0 eq} D +/ON {OU{Ty AR AI NN get dup 1 add Ln Ns Ty 2 mod 0 eq{(.  )}{(\)  )}ie join + dup SW pop neg 0 R CP E 0 lt{0 E M}{pop}ie CP BB show /Ms t D}if} D +/Ln {AR AI 3 -1 roll put}D +/SP {dup CI lt BP not and{dup CI sub 0 E R /CI E D}{pop}ie} D +/BN {PF{WR /HM f D}{BT NL}ie} D +/NN {dup 0 lt{pop 0}if} D +/h {(h) HI ST cvs join cvx exec dup 1 get E Nf{0 get E join}{pop}ie} D +/H {/fn FN D /Hi E 1 add D 1 sub /HL E D /H2 HL 2 add D /GS EZ H2 get D + E Tm H2 get GS mul BE dup 0 gt{1 sub}{pop EG H2 get dup 0 lt{pop AT}if}ie NA + WW Np /SL SL 1 add D /FN EF H2 get D GS Ey H2 get FS + EU H2 get Sc Hs not HL Hl lt and Hs HL hl lt and or Hi 0 eq or + {/HI Hi D /Hs t D /hl HL D /Hv HL D}if HL Hl lt{/hi Hi D}if + Nf HI 0 gt and{(h) Hi ST cvs join cvx exec 0 get WB}if + /HF t D /AH f D /PO f D} D +/EH {Bm H2 get GS mul BE OA /SL SL 1 sub NN D /CF 0 D /FN fn D + SZ SL get FR SL get FS /HF f D /GS Ts D ()Ec} D +/P {E PF{WR}{PO{EP}{BN}ie Ts 4 mul Np AE not{Tm 0 get Ts mul neg SP}if + dup 0 ge AH and{Pi Pd}if}ie 1 sub dup 0 lt{pop AV AL get}if /AT E D /PO t D} D +/EP {PF{WR}{BN Ts 4 mul Np}ie AE not{Bm 0 get Ts mul neg SP}if + /AT AV AL get D /PO f D} D +/BE {E PO{EP}{BN}ie Ts 4 mul Np neg SP} D +/HR {/Aw W EO sub D /RW E dup 0 gt{Aw mul}{neg}ie dup Aw gt{pop Aw}if D /RZ E D + E BN Ts neg SP 1 sub 2 div Aw RW sub mul EO add CP E pop M PF{0 Ps neg R}if + 0 Np OU{gsave RZ LW Cf{Hc VC}{0 Sg}ie CP BB RW 0 RL CP BB stroke grestore}if + /CI 0 D /BP f D PF not{Ts neg SP}if /Ms t D} D +/AD {I NL EG 14 get dup 0 lt{pop AT}if NA /AE t D Tm 14 get Ts mul neg SP + Cf{EU 14 get dup -1 eq{pop CA CL get}if Sc}if} D +/DA {BN ()ES OA /AE f D ()Ec Bm 14 get Ts mul neg SP} D +/PR {/MW E D /Li E D Tm 1 get Ps mul BE 0 NA /FN Fp D /PF t D SI /SL SL 1 add D + /CF 0 D Ps CS mul Ts div MW WC mul CS mul Ts div dup LL gt PL 0 eq and + {LL div div}{pop}ie Ey 1 get FS CP E pop LE add YI neg div cvi dup Li lt + AH and{4 lt YI Li mul 5 mul LE add 0 gt or PL 0 eq and{NP}if}{pop}ie + EU 1 get Sc /GS Ps D}D +/RP {WR NL () /PF f D SI /FN 0 D ES Bm 1 get Ps mul neg SP OA /GS Ts D} D +/SI {/XO Lm 15 get BC NN mul Lm 16 get AI UI sub NN mul add + Lm 17 get UI NN mul add Lm 20 get LG NN mul add Ts mul + PF{Lm 1 get Ps mul add}if EO add D + /MR Rm 15 get BC NN mul Rm 16 get AI UI sub NN mul add + Rm 17 get UI NN mul add Rm 20 get LG NN mul add Ts mul + PF{Rm 1 get Ps mul add}if D /LL W XO sub MR sub D} D +/DT {/cC E D BN /LG LG 1 sub D SI /LG LG 1 add D WW 2 div Np BL} D +/DD {WB Cc 0 eq cC 0 eq and L1 0 eq or Lm 20 get Ts mul L1 sub TB{BW add}if + Ts 2 div lt or NL /LF E D SI BL /cC 0 D} D +/DL {Dc LG Cc put /Cc E D BG{Tm 18 get Ts mul BE}{BN}ie /LG LG 1 add D BL} D +/LD {BN LG 0 gt{/LG LG 1 sub D}if /Cc Dc LG get D SI + BG{()Bm 18 get Ts mul BE}if BL} D +/UL {BG{Tm 17 get Ts mul BE}{BN}ie NR AI NN 0 put /UI UI 1 add D + /AI AI 1 add D SI BL} D +/LU {BN /UI UI 1 sub D /AI AI 1 sub D SI BG{()Bm 17 get Ts mul BE}if BL} D +/OL {E BG{Tm 16 get Ts mul BE}{BN}ie TR AI NN Ty put /Ty E D NR AI NN 1 put + /AI AI 1 add D SI BL 1 Ln} D +/LO {BN /AI AI 1 sub D /Ty TR AI get D SI BG{()Bm 16 get Ts mul BE}if BL} D +/LI {E BN -1 SP /BP f D /CI 0 D 0 Np NR AI 1 sub NN get 1 eq + {dup dup 0 gt E 4 le and{/Ty E D}{pop}ie + /L1 L1 Ty AR AI NN get Ns SW pop XO sub dup 0 lt{pop 0}if add D ( ON )} + {pop ( B )}ie C1 E join /C1 E D CS Mf gt{/Mf CS D}if BL} D +/BQ {Tm 15 get Ts mul BE /BC BC 1 add D SI BL} D +/QB {Bm 15 get Ts mul BE /BC BC 1 sub D SI BL} D +/Al {E EP 1 sub dup 0 lt{pop AV AL get}if NA} D +/Ea {EP OA} D +/WB {PF{WR}{BT}ie} D +/F1 {WB /FN 0 D CS 0 FS} D +/F2 {WB /FN WI D CS 0 FS} D +/HY {/Hy t D WB /Hy f D} D +/YH {WB} D +/A {/LT E D LT 1 eq{/RN E D}if /Lh E D WB /C1 C1 ( Cp ) join D + Lc AF not and{Cl Sc}if /AF t D} D +/EA {Lc AF and{Ec}{WB}ie TL Pa AF and Lh 0 ne and + {( \() Lh join (\)) join /AF f D WB}if /AF f D} D +/TL {C1 ( Tl ) apa /C1 E D} d +/apa {AF OU and Lh 0 ne LT 1 eq or and{LT 1 eq{RN ( /) E ST cvs join} + {(\() Lh join (\)) join}ie E join join}{pop}ie} d +/Cp {/Xc CP /Yc E D D} D +/SS {Cf{dup 0 ge{EU E get dup -1 eq{pop CA CL get}if}{pop CA CL get}ie Sc} + {pop}ie SZ SL get /SL SL 1 add D} D +/I {WB 8 SS 1 FS} D +/EM {WB 8 SS /CF CF 1 xor D 0 FS} D +/BD {WB 9 SS 2 FS} D +/TT {WB 10 SS /FN Fp D 0 FS} D +/KB {WB 11 SS /FN Fp D 2 FS} D +/CT {WB 12 SS 1 FS} D +/SM {WB 13 SS /FN Fp D 0 FS} D +/Q {/QL QL 1 add D QO QL 2 mod get La get join WB} D +/EQ {QC QL 2 mod get La get join WB /QL QL 1 sub D} D +/RO {WB -1 SS /CF 0 D 0 FS} D +/SY {WB -1 SS -1 FS} D +/MY {WB -1 SS -2 FS} D +/ES {WB /SL SL 1 sub NN D /CF 0 D /FN FO SL get D SZ SL get FR SL get FS ()Ec}D +/FZ {3 sub 1.2 E exp GS mul E WB TL /C1 C1 ( Cp ) join D /SL SL 1 add D 0 FS} D +/Ef {WB TL ()ES /C1 C1 ( Cp ) join D} D +/BZ {dup /Bf E D FZ}D +/Sc {dup -1 ne Cf and{/CL CL 1 add D dup 0 eq{pop [0 0 0]}if + dup CA E CL E put VS ( VC ) join C1 E join /C1 E D}{pop}ie} D +/Ec {WB Cf{/CL CL 1 sub NN D CA CL get VS ( VC ) join C1 E join /C1 E D}if} D +/VS {dup type /arraytype eq{([) E {ST cvs join ( ) join}forall (]) join}if} D +/VC {{255 div}forall setrgbcolor} D +/Sl {dup type /integertype ne{Ds}if /La E D WB}d +/UN {WB /UF t D} D +/NU {WB /UF f D} D +/SE {WB /sF t D} D +/XE {WB /sF f D} D +/sM {/C1 C1 ( k1 ) join D}d +/eM {/C1 C1 ( k2 ) join D}d +/k1 {/YC CP E pop Ts add D /mF t D /f1 t D}d +/k2 {gsave 3 LW -9 CP E pop Ts 0.2 mul sub M -9 YC L stroke grestore /mF f D}d +/Ac {/AC E D WB}d +/Ca {eA{( \()join AC join(\) )join}if WB}d +/s {OU{gsave 0 CS .25 mul R dup SW pop CJ 0 RL stroke grestore}if}D +/CJ {AT 3 eq LB and{E dup dup length 1 sub A1 mul E + {( ) search{pop pop E A2 add E}{pop exit}ie}loop 3 -1 roll add + W CP pop sub 2 copy gt{E}if pop}if}D +/So {/Co E D} D +/SO {C1 Yo ST cvs join ( So ) join /C1 E D (j) SW pop 2 div Pd} D +/Se {E WB CS E div Pd}D +/Pd {dup type /stringtype eq{SW pop}if dup /L1 E L1 add D + ST cvs ( 0 R ) join C1 E join /C1 E D} D +/Sp {0.35 CO} D +/Sb {-0.2 CO} D +/CO {OV Io Yo put /Yo E CS mul Yo add D /Io Io 1 add D -1.5 Io mul 3 add FZ SO + CS Yo add dup YA gt{/YA E D}{pop}ie + Yo neg dup YB gt{/YB E D}{pop}ie} D +/Es {ES /Io Io 1 sub NN D /Yo OV Io get D SO} D +/SB {/N2 0 D 0 1 NI{/N E D{IX N2 get 0 lt{/N2 N2 1 add D}{exit}ie}loop + /K WS N get FC N get mul D /NY AY N2 get D /BV NY array D + 0 1 NY 1 sub{/TM K string D currentfile TM readhexstring pop pop BV E TM put} + for BM N BV put /N2 N2 1 add D}for} D +/IC [{/MA E D /MB 0 D}{2 div /MA E D /MB MA D}{/MB E CS sub D /MA CS D} + {pop /MA YS AB mul D /MB 1 AB sub YS mul D}{pop /MA 0 D /MB 0 D}] D +/IP {BV N get /N N 1 add D} D +/II {/K E D IX K get 0 lt{/EC E D}if /TY E D + TY 4 eq{/Y E D /X E D}if TY 3 eq{/AB E D}if + /XW AX K get D /YW AY K get D /IS SG IT K get get D /XS XW IS mul D + /YS YW IS mul D YS IC TY get exec /MA MA Fl not{3 add}if D} D +/IM {II /ty TY D /xs XS D /ys YS D /ya YA D /yb YB D /ma MA D /mb MB D /k K D + /ec EC D /BP f D /CI 0 D WB TL L1 xs add dup XO add MR add W gt + {pop /ma ma Fl{3 add}if D NL /YA ma D /YB mb D /YS ys D /L1 xs D} + {/L1 E D ma YA gt{/YA ma D}if mb YB gt{/YB mb D}if}ie /TB f D + OU{CP E pop YS sub LE neg lt Fl not and PB not and{NP /YA ma D /YB mb D}if + /BP f D ty ST cvs ( ) join IX k get 0 lt{(\() join ec join (\) ) join}if + k ST cvs join ty 3 eq{AB ST cvs ( ) join E join}if + ty 4 eq{X ST cvs ( ) join Y ST cvs join ( ) join E join}if C1 E join + ( DI ) join FP 2 eq FP 1 eq AF and or{( FM ) join}if + ( Il Cp ) apa /C1 E D /EN f D}if /HM t D /T f D} D +/DI {II /Xc CP /Yc E D D /YN YW neg D /HM t D /CI 0 D /K2 IX K get D gsave + TY 4 eq{OX X IS mul add OY FY add YS sub Y IS mul sub} + {/FY YS D CP MB sub 2 copy /OY E D /OX E D}ie + translate K2 0 ge{/DP AZ K2 get D /BV BM K2 get D XS YS scale /N 0 D XW YW DP + [XW 0 0 YN 0 YW] {IP} FC K2 get 1 eq{image}{f 3 colorimage}ie} + {EX}ie grestore XS 0 R /Ms t D} D +/FM {gsave 0 Sg CP MB sub translate XS neg 0 M 0 YS RL XS 0 RL 0 YS neg RL + XS neg 0 RL stroke grestore} D +/NA {/AT E D /AL AL 1 add D AV AL AT put} D +/OA {AL 0 gt{/AL AL 1 sub D /AT AV AL get D}if} D +/D1 {/BR {CP E pop E BN Mb{CP E pop eq{0 YI R}if}{pop}ie} D + /Sn {OU{C1 E ST cvs join ( Ld ) join /C1 E D}{pop}ie} D} D +/D1 {/BR {BN} D /Sn {OU {C1 E ST cvs join ( Ld ) join /C1 E D} {pop} ie} D} D +/TC {/TF t D /ML 0 D HN{SW pop dup ML gt{/ML E D}{pop}ie}forall NP /RM RM not D + RC /OU Tc D Ep /PN 0 D Ms not TP and{Ip}if /W IW ML sub Ts sub D + /A0 0 D TH{/BR {( ) join BT} D /Sn {pop} D /Au () D}if} D +/TN {0 eq{E EA PF HF or not XR and{HN E get Xr}{pop}ie} + {OU{Tn 0 ge{() BN}if /Tn E D}{pop}ie WB}ie} D +/NT {OU LB not and Tn 0 ge and{PL 0 eq{Ms not{CS CF FS}if CP dup + /y E YA sub D W 9 sub CS -1.8 mul XO L1 add 2 add{y M (.) show}for + HN Tn get dup SW pop IW E sub y M show CP BB M}if /Tn -1 D}if} D +/Ld {/DN E D HN DN Pn put [/View [/XYZ -4 Fl{PS}{CP YA add US E pop}ie null] + /Dest DN ST cvs cvn /DEST pdfmark} D +/C {ND 1 eq{1 sub}if TI mul /XO E D NL Nf not{pop()}if 0 3 -1 roll 1 A} D +/OP {BP not{NP}if PN 2 mod 0 eq{/Ms t D NP}if}D +/Ep {Xp PN 2 mod 0 eq and OU and{/Pn (-) D showpage /PM 1 D LA}if}D +/Dg [73 86 88 76 67 68 77] D +/Rd [0 [1 1 0][2 1 0][3 1 0][2 1 1][1 1 1][2 2 1][3 3 1][4 4 1][2 1 2]] D +/Ns {/m E D /c E 32 mul D /j m 1000 idiv D /p j 12 add string D + c 96 le m 0 gt and{c 32 le {/i 0 D /d 77 D /l 100 D /m m j 1000 mul sub D +  j -1 1 {pop p i d c add put /i i 1 add D}for +  4 -2 0 {/j E D /n m l idiv D /m m n l mul sub D /d Dg j get D +   n 0 gt {/x Rd n get D x 0 get -1 1 {pop p i d c add put /i i 1 add D}for +   p i x 1 get sub Dg x 2 get j add get c add put}if /l l 10 idiv D +  }for p 0 i GI} +  {/i ST length 1 sub D m {1 sub dup 0 ge{dup 26 mod c add 1 add +   ST i 3 -1 roll put 26 idiv dup 0 eq{pop exit}if}if /i i 1 sub D}loop +   ST i ST length i sub GI}ie} + {m p cvs}ie} D +/US {matrix currentmatrix matrix defaultmatrix matrix invertmatrix + matrix concatmatrix transform} D +/GB {Gb{US}if}D +/Tl {/Rn E D Xc CP pop ne{ + [/Rect [Xc 1 sub Yc cS 0.25 mul sub GB CP E 1 add E cS 0.85 mul add GB] +  /Subtype /Link /Border [0 0 Cf Lc and LX and AU or{0}{1}ie] Rn type +  /nametype eq {/Dest Rn}{/Action [/Subtype /URI /URI Rn] Cd}ie +  /ANN pdfmark}if} D +/Il {/Rn E D [/Rect [Xc Yc GB Xc XS add Yc YS add GB] /Subtype /Link + /Border [0 0 0] Rn type /nametype eq{/Dest Rn} + {/Action [/Subtype /URI /URI Rn] Cd}ie /ANN pdfmark} D +/XP {[{/Z Bz 2 div D Z 0 R Z Z RL Z neg Z RL Z neg Z neg RL Z Z neg RL + Fi cH 1 eq and{fill}if} {Bz 0 RL 0 Bz RL Bz neg 0 RL 0 Bz neg RL + Fi cH 1 eq and{fill}if} {0 -5 R Bz 0 RL 0 21 RL Bz neg 0 RL 0 -21 RL}]} D +/MS {/Sm E D WB}D +/O {BN()0 Sm BX} D +/BX {/Bt E D Bt 2 lt{/Ch E D CS 0.8 mul}{11 mul}ie W XO sub MR sub + 2 copy gt{E}if pop /HZ E D Bt 2 eq{Fi not{pop()}if ( )E join /Ft E D TT + /PF t D /MW 1 D /Li 1 D /Fw Ft SW pop D Fw HZ gt{/HZ Fw 8 add D}if + HZ ST cvs( )join}{WB Ch ST cvs( )join}ie L1 HZ add XO add MR add W gt{NL}if + Bt 2 eq{Ft ES Fw neg HM{CS sub}if Pd}if Bt ST cvs join( Bx )join + Bt 2 eq HM and{CS Pd}if C1 E join /C1 E D /L1 L1 HZ add D /T f D + ( ) Pd /PF f D Bt 2 lt{YA CS .8 mul lt{/YA CS .8 mul D}if} + {YB 5 lt{/YB 5 D}if YA 21 lt{/YA 21 D}if}ie /CI 0 D} D +/Bx {dup 2 eq{E /Bz E D}{E /cH E D /Bz CS .8 mul D}ie + OU {gsave 0 Sg XP E get exec stroke grestore}{pop}ie Bz 0 R /Ms t D}D +/SD {FD 4 mul Dy add DZ NF newpath 0 0 M DX t charpath pathbbox + 3 -1 roll sub /DY E D E dup /X1 E D sub WM mul WX DY mul add WM DG mul E div + /DF E D /DR WX DF mul DY mul WM div 2 div D} d +/Sd {gsave 0 IL Di mul neg translate IL IW atan Di 0 eq{neg}if rotate + FD 4 mul Dy add DZ NF DR X1 sub DY 2 div neg M cD VC DX show grestore} d +/Pt {/tp t D Tp{NP /Pn (TP) D 0 Tt neg R Th BN NP Ep ET RC ZF}if /tp f D} D +/RC {/AI 0 D /LG 0 D /BC 0 D /UI 0 D /PF f D /Cc 0 D /cC 0 D /Dc 10 array D + /NR [0 1 9{pop 0}for] D /La Ds D /AR 10 array D /TR 10 array D /AV 30 array D + SI /AL -1 D /AT A0 D AT NA /OV 9 array D /Yo 0 D /Co 0 D /Io 0 D /Hy f D + /Ph f D /CL -1 D Ct Sc}D +/ZF {/FR [0 1 30{pop 0}for] D /SZ [0 1 30{pop 0}for] D /FO [0 1 30{pop 0}for] D + /SL 0 D /CF 0 D /FN 0 D 0 Ts SF}D +/QO [[(\234)(\233)(\253\240)(\232)(\273)(\253)][(')(`)(\253\240)(\231)(\273)(\253)]] D +/QC [[(\234)(\234)(\240\273)(\233)(\253)(\273)][(')(')(\240\273)(`)(\253)(\273)]] D +/Hf EF length 2 sub D +/Hz EZ Hf get D +/HS Ey Hf get D +/Fz EZ Hf 1 add get D +/Fs Ey Hf 1 add get D +/LE IL D +/Ps EZ 1 get D +/Fp EF 1 get D +/XO 0 D +/YI 0 D +/CI 0 D +/FP 0 D +/WW Ts 7 mul D +/Mf 0 D +/YA 0 D +/YB 0 D +/Cs Ts D +/GS Ts D +/F0 0 D +/NS 0 D +/NB 0 D +/N 0 D +/C0 [] D +/C1 () D +/Lo 0 D +/L1 0 D +/LM 0 D +/PH 0 D +/EC 0 D +/Lh 0 D +/LT 0 D +/CH 1 string D +/ST 16 string D +/CA 9 array D +/HC (\255) D +/HM f D +/PF f D +/EN f D +/TB f D +/UF f D +/sF f D +/AE f D +/AF f D +/BP t D +/CD f D +/PA t D +/GL f D +/T t D +/HF f D +/AH f D +/SA f D +/PB f D +/f1 f D +/mF f D +/OX 0 D +/OY 0 D +/FY 0 D +/EO 0 D +/FB 0 D +/PL 0 D +/Bw 0 D +/PD -1 D +/TP f D +/tp f D +/TH t D +/Ty 4 D +/Tn -1 D +/Fl t D +/LB t D +/PM 1 D +/Ms f D +/Ba f D +/Bb f D +/Hl 3 D +/hl 6 D +/Hv 6 D +/Hs f D +/HI 0 D +/hi 0 D +/PO t D +/TE f D +/LF t D +/BO 0 D +/Sm 1 D +/Bf 3 D +/A1 0 D +/A2 0 D +/Ds 1 D +/QL -1 D +/Cb Db D +/Ct Dt D +/Cl Dl D +[/Creator (html2ps version 1.0 beta7) /Author () /Keywords (xsd, xml, schema, c++, mapping, data, binding, tree, serialization, guide, manual, examples) /Subject () + /Title (C++/Tree Mapping User Manual) /DOCINFO pdfmark +/ND 1 D +/HN [(1) (1) (1) (1) (1) (1) (1) (2) (2) (2) (2) (3) (3) (4) (4) (5) (5) (5) +(6) (6) (7) (7) (??) (10) (11) (12) (13) (14) (16) (19) (20) (21) (22) (24) +(24) (25) (26) (27) (28) (29) (29) (30) (31) (32) (33) (37) (37) (37) (39) +(41) (45) (48) (55) (55) (58) (59) (60) (62) (64) (65) (68) (74) (75) (80) +(82) (85) (85) (86) (88) (89) (89) (90) (91) (91) (91) (92) (92) (93) (93) +(94) (94) (94) (96) (97) (99) (99) (100) (100) (100) (101) (101) (102) (103) +(103) (106) (107) (??) (1) (1) (1) (1) (2) (2) (2) (2) (3) (3) (4) (4) (5) +(5) (5) (6) (6) (7) (7) (10) (11) (12) (13) (14) (16) (19) (20) (21) (22) +(24) (24) (25) (26) (27) (28) (29) (29) (30) (31) (32) (33) (37) (37) (37) +(39) (41) (45) (48) (55) (55) (58) (59) (60) (62) (64) (65) (68) (74) (75) +(80) (82) (85) (85) (86) (88) (89) (89) (90) (91) (91) (91) (92) (92) (93) +(93) (94) (94) (94) (96) (97) (99) (99) (100) (100) (100) (101) (101) (102) +(103) (103) (106) (107)] D +/h0 [()(Table of Contents)] D +/h1 [(1\240\240)(Preface)] D +/h2 [(1.1\240\240)(About This Document)] D +/h3 [(1.2\240\240)(More Information)] D +/h4 [(2\240\240)(1 Introduction)] D +/h5 [(3\240\240)(2 C++/Tree Mapping)] D +/h6 [(3.1\240\240)(2.1 Preliminary Information)] D +/h7 [(3.1.1\240\240)(2.1.1 C++ Standard)] D +/h8 [(3.1.2\240\240)(2.1.2 Identifiers)] D +/h9 [(3.1.3\240\240)(2.1.3 Character Type and Encoding)] D +/h10 [(3.1.4\240\240)(2.1.4 XML Schema Namespace)] D +/h11 [(3.1.5\240\240)(2.1.5 Anonymous Types)] D +/h12 [(3.2\240\240)(2.2 Error Handling)] D +/h13 [(3.2.1\240\240)(2.2.1 xml_schema::duplicate_id)] D +/h14 [(3.3\240\240)(2.3 Mapping for import and include)] D +/h15 [(3.3.1\240\240)(2.3.1 Import)] D +/h16 [(3.3.2\240\240)(2.3.2 Inclusion with Target Namespace)] D +/h17 [(3.3.3\240\240)(2.3.3 Inclusion without Target Namespace)] D +/h18 [(3.4\240\240)(2.4 Mapping for Namespaces)] D +/h19 [(3.5\240\240)(2.5 Mapping for Built-in Data Types)] D +/h20 [(3.5.1\240\240)(2.5.1 Inheritance from Built-in Data Types)] D +/h21 [(3.5.2\240\240)(2.5.2 Mapping for anyType)] D +/h22 [(3.5.3\240\240)(2.5.3 Mapping for anySimpleType)] D +/h23 [(3.5.4\240\240)(2.5.4 Mapping for QName)] D +/h24 [(3.5.5\240\240)(2.5.5 Mapping for IDREF)] D +/h25 [(3.5.6\240\240)(2.5.6 Mapping for base64Binary and hexBinary)] D +/h26 [(3.6\240\240)(2.5.7 Time Zone Representation)] D +/h27 [(3.7\240\240)(2.5.8 Mapping for date)] D +/h28 [(3.8\240\240)(2.5.9 Mapping for dateTime)] D +/h29 [(3.9\240\240)(2.5.10 Mapping for duration)] D +/h30 [(3.10\240\240)(2.5.11 Mapping for gDay)] D +/h31 [(3.11\240\240)(2.5.12 Mapping for gMonth)] D +/h32 [(3.12\240\240)(2.5.13 Mapping for gMonthDay)] D +/h33 [(3.13\240\240)(2.5.14 Mapping for gYear)] D +/h34 [(3.14\240\240)(2.5.15 Mapping for gYearMonth)] D +/h35 [(3.15\240\240)(2.5.16 Mapping for time)] D +/h36 [(3.16\240\240)(2.6 Mapping for Simple Types)] D +/h37 [(3.16.1\240\240)(2.6.1 Mapping for Derivation by Restriction)] D +/h38 [(3.16.2\240\240)(2.6.2 Mapping for Enumerations)] D +/h39 [(3.16.3\240\240)(2.6.3 Mapping for Derivation by List)] D +/h40 [(3.16.4\240\240)(2.6.4 Mapping for Derivation by Union)] D +/h41 [(3.17\240\240)(2.7 Mapping for Complex Types)] D +/h42 [(3.17.1\240\240)(2.7.1 Mapping for Derivation by Extension)] D +/h43 [(3.17.2\240\240)(2.7.2 Mapping for Derivation by Restriction)] D +/h44 [(3.18\240\240)(2.8 Mapping for Local Elements and Attributes)] D +/h45 [(3.18.1\240\240)(2.8.1 Mapping for Members with the One Cardinality Class)] D +/h46 [(3.18.2\240\240)(2.8.2 Mapping for Members with the Optional Cardinality Class)] D +/h47 [(3.18.3\240\240)(2.8.3 Mapping for Members with the Sequence Cardinality Class)] D +/h48 [(3.18.4\240\240)(2.8.4 Element Order)] D +/h49 [(3.19\240\240)(2.9 Mapping for Global Elements)] D +/h50 [(3.19.1\240\240)(2.9.1 Element Types)] D +/h51 [(3.19.2\240\240)(2.9.2 Element Map)] D +/h52 [(3.20\240\240)(2.10 Mapping for Global Attributes)] D +/h53 [(3.21\240\240)(2.11 Mapping for xsi:type and Substitution Groups)] D +/h54 [(3.22\240\240)(2.12 Mapping for any and anyAttribute)] D +/h55 [(3.22.1\240\240)(2.12.1 Mapping for any with the One Cardinality Class)] D +/h56 [(3.22.2\240\240)(2.12.2 Mapping for any with the Optional Cardinality Class)] D +/h57 [(3.22.3\240\240)(2.12.3 Mapping for any with the Sequence Cardinality Class)] D +/h58 [(3.22.4\240\240)(2.12.4 Element Wildcard Order)] D +/h59 [(3.22.5\240\240)(2.12.5 Mapping for anyAttribute)] D +/h60 [(3.23\240\240)(2.13 Mapping for Mixed Content Models)] D +/h61 [(4\240\240)(3 Parsing)] D +/h62 [(4.1\240\240)(3.1 Initializing the Xerces-C++ Runtime)] D +/h63 [(4.2\240\240)(3.2 Flags and Properties)] D +/h64 [(4.3\240\240)(3.3 Error Handling)] D +/h65 [(4.3.1\240\240)(3.3.1 xml_schema::parsing)] D +/h66 [(4.3.2\240\240)(3.3.2 xml_schema::expected_element)] D +/h67 [(4.3.3\240\240)(3.3.3 xml_schema::unexpected_element)] D +/h68 [(4.3.4\240\240)(3.3.4 xml_schema::expected_attribute)] D +/h69 [(4.3.5\240\240)(3.3.5 xml_schema::unexpected_enumerator)] D +/h70 [(4.3.6\240\240)(3.3.6 xml_schema::expected_text_content)] D +/h71 [(4.3.7\240\240)(3.3.7 xml_schema::no_type_info)] D +/h72 [(4.3.8\240\240)(3.3.8 xml_schema::not_derived)] D +/h73 [(4.3.9\240\240)(3.3.9 xml_schema::no_prefix_mapping)] D +/h74 [(4.4\240\240)(3.4 Reading from a Local File or URI)] D +/h75 [(4.5\240\240)(3.5 Reading from std::istream)] D +/h76 [(4.6\240\240)(3.6 Reading from xercesc::InputSource)] D +/h77 [(4.7\240\240)(3.7 Reading from DOM)] D +/h78 [(5\240\240)(4 Serialization)] D +/h79 [(5.1\240\240)(4.1 Initializing the Xerces-C++ Runtime)] D +/h80 [(5.2\240\240)(4.2 Namespace Infomap and Character Encoding)] D +/h81 [(5.3\240\240)(4.3 Flags)] D +/h82 [(5.4\240\240)(4.4 Error Handling)] D +/h83 [(5.4.1\240\240)(4.4.1 xml_schema::serialization)] D +/h84 [(5.4.2\240\240)(4.4.2 xml_schema::unexpected_element)] D +/h85 [(5.4.3\240\240)(4.4.3 xml_schema::no_type_info)] D +/h86 [(5.5\240\240)(4.5 Serializing to std::ostream)] D +/h87 [(5.6\240\240)(4.6 Serializing to xercesc::XMLFormatTarget)] D +/h88 [(5.7\240\240)(4.7 Serializing to DOM)] D +/h89 [(6\240\240)(5 Additional Functionality)] D +/h90 [(6.1\240\240)(5.1 DOM Association)] D +/h91 [(6.2\240\240)(5.2 Binary Serialization)] D +/h92 [(7\240\240)(Appendix A \236 Default and Fixed Values)] D +/Hr [97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 +115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 +133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 +151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 +169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 +187 188]D +/HV [1 2 2 1 1 2 3 3 3 3 3 2 3 2 3 3 3 2 2 3 3 3 3 3 3 2 2 2 2 2 2 2 2 +2 2 2 3 3 3 3 2 3 3 2 3 3 3 3 2 3 3 2 2 2 3 3 3 3 3 2 1 2 2 2 3 3 3 3 3 +3 3 3 3 2 2 2 2 1 2 2 2 2 3 3 3 2 2 2 1 2 2 1]D +/Cn [2 0 0 0 23 5 0 0 0 0 0 1 0 3 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 4 0 0 0 0 2 0 0 4 0 0 0 0 2 0 0 0 0 5 0 0 0 0 0 0 7 0 0 9 0 0 0 0 0 +0 0 0 0 0 0 0 0 7 0 0 0 3 0 0 0 0 0 0 2 0 0 0]D +Hr length 0 gt{[/PageMode /UseOutlines /DOCVIEW pdfmark}if +/Hn 1 D +0 1 Hr length 1 sub{ + /Bn E D [Cn Bn get dup 0 gt{/Count E HV Bn get Bl ge{neg}if}{pop}ie + /Dest Hr Bn get dup abs ST cvs cvn E 0 ge{(h)Hn ST cvs join cvx exec + dup 1 get E Nf{0 get E join}{pop}ie /Hn Hn 1 add D}{()}ie + /Title E dup length 255 gt{0 255 getinterval}if /OUT pdfmark}for +ZF /FN Fp D Ps 0 FS /WC Wf{( )}{<A1A1>}ie SW pop D +ET RC ZF +/Df f D +/R0 (http://www.codesynthesis.com/licenses/fdl-1.2.txt) D +/R1 (http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/index.xhtml) D +/R2 (http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/cxx-tree-manual.pdf) D +/R3 (http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/cxx-tree-manual.ps) D +/R1 (http://www.codesynthesis.com/products/xsd) D +/R2 (http://codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/index.xhtml) D +/R3 (http://codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/cxx-tree-manual.pdf) D +/R4 (http://codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/cxx-tree-manual.ps) D +/R5 (http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/guide/) D +/R6 (http://wiki.codesynthesis.com/Tree/Customization_guide) D +/R7 (http://wiki.codesynthesis.com/Tree/FAQ) D +/R8 (http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml) D +/R9 (http://www.codesynthesis.com/mailman/listinfo/xsd-users) D +/R10 (http://www.codesynthesis.com/pipermail/xsd-users/) D +/R11 (http://en.wikipedia.org/wiki/Character_code) D +/TS { + tables E get /table E D + table aload pop /rdesc E D /cdesc E D /tdesc E D + tdesc aload pop /capalg E D /caption E D /rules E D /frame E D /nfoot E D +  /nhead E D /ncol E D /nrow E D /border E D /twid E D /units E D /talign E D +  /flow E D /clear E D /tclass E D pop pop + /w W D /eps 0.1 D /OU f D /PL 1 D + /FN EF 21 get D EZ 21 get Ey 21 get FS + 0 1 1{ +  /pass E D +  0 1 nrow{ +   /irow E D +   /cells rdesc irow get 6 get D +   0 1 ncol{ +    /icol E D +    /cell cells icol get D +    cell 0 ne{ +     cell aload pop /ang E D /CB E D pop pop pop +     /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D +     /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D +     /cmin E D /proc E D +     rspan 0 eq{/rspan nrow irow sub 1 add D}if +     cspan 0 eq{/cspan ncol icol sub 1 add D}if +     pass 0 eq cspan 1 eq and pass 1 eq cspan 1 gt and or{ +      /W 1e5 D /LL W D /PH 1 D +      ctype 1 eq{() BD}if +      RC align NA +      AT 4 eq{/CD t D /DC dp D /LN 0 D /M1 0 D /M2 0 D}{/CD f D}ie +      0 0 M /LM 0 D proc exec BN +      AT 4 eq{ +       LN array astore cell 15 3 -1 roll put +       cdesc icol get dup dup 5 get M1 lt{5 M1 put}{5 get /M1 E D}ie +       dup 6 get M2 lt{6 M2 put}{6 get /M2 E D}ie +       /LM M1 M2 add D +      }if +      /CD f D +      ang 0 ne{/LM CP E pop neg D}if +      /thiswid LM left add right add eps add D +      /oldmin 0 D /oldmax 0 D +      0 1 cspan 1 sub{ +       icol add cdesc E get dup 2 get /oldmax E oldmax add D +       1 get /oldmin E oldmin add D +      }for +      thiswid oldmax ge{ +       0 1 cspan 1 sub{ +        icol add cdesc E get dup 2 E 2 get oldmax 0 eq +         {pop thiswid cspan div}{thiswid mul oldmax div}ie +        put +       }for +      }if +      nowrap 1 eq{ +       thiswid oldmin ge{ +        0 1 cspan 1 sub{ +         icol add cdesc E get dup 1 E 1 get oldmin 0 eq +          {pop thiswid cspan div}{thiswid mul oldmin div}ie +         put +        }for +       }if +      }{ +       /W 0 D /LL W D /PH 2 D +       ctype 1 eq{() ES () BD}if +       0 0 M /LM 0 D RC proc exec BN +       /thiswid LM left add right add eps add D +       thiswid oldmin ge{ +        0 1 cspan 1 sub{ +         icol add cdesc E get dup 1 E 1 get oldmin 0 eq +          {pop thiswid cspan div}{thiswid mul oldmin div}ie +         put +        }for +       }if +      }ie +      ctype 1 eq{() ES}if +     }if +    }if +   }for +  }for + }for + /tmin 0 D /tmax 0 D + 0 1 ncol{ +  cdesc E get dup 1 get E 2 get 2 copy gt{pop dup}if +  tmax add /tmax E D tmin add /tmin E D + }for + twid 0 lt{twid neg IW gt{IW neg}{twid}ie /twid E D}if + tdesc 0 twid neg tmin 2 copy lt{E}if pop put + tdesc 1 twid neg tmax 2 copy lt{E}if pop put + /W w D /LL W D /OU t D /PH 0 D /PL 0 D +} D +/PT { + /PL PL 1 add D + tables E get /table E D Tm 21 get Ts mul BE + PL 2 ge{save}if + /SL SL 1 add D /FN EF 21 get D EZ 21 get Ey 21 get FS + table aload pop /rdesc E D /cdesc E D /tdesc E D + tdesc aload pop /capalg E D /caption E D /rules E D /frame E D /nfoot E D +  /nhead E D /ncol E D /nrow E D /border E D /twid E D /units E D /talign E D +  /flow E D /clear E D /tclass E D /tmax E D /tmin E D + /w W D /xo XO D /mr MR D /ll LL D /lg LG D /ai AI D /bc BC D /nr NR D /ar AR D + /tr TR D /ui UI D /ph PH D /a0 A0 D /pf PF D /at AT D /av AV D /al AL D + /Le LE D /la La D + talign 0 lt{/talign AL 0 gt{AV AL get}{A0 2 le{A0}{0}ie}ie D}if + ph 1 eq ph 2 eq or{ +  NL ph 1 eq{tmax}{tmin}ie dup XO add LM gt{/LM E XO add D}{pop}ie LM E + }{ +  /PH 3 D /LE 1e5 D RC %ZF +  border 0 gt{/border 1 D}if +  /twidth 0 D /avail W xo sub D +  twid 0 eq{0 1 ncol{cdesc E get dup 2 get E 3 get dup 0 gt{div neg dup twid lt +   {/twid E D}{pop}ie}{pop pop}ie}for}if +  /twid twid dup 0 lt{neg avail 2 copy gt{E}if pop}{avail mul}ie D +  /OK t D 0 1 ncol{cdesc E get dup 1 get E 3 get twid mul gt{/OK f D}if}for +  0 1 ncol{ +   cdesc E get dup 1 get /colmin E D dup 3 get /cwid E twid mul D dup +   tmax avail le{2 get}if +   tmin avail le tmax avail gt and{ +    dup 2 get E 1 get dup 3 1 roll sub avail tmin sub mul tmax tmin sub div add +   }if +   tmin avail gt{1 get}if +   0 E colmin cwid lt OK and{pop cwid}if dup /twidth E twidth add D put +  }for +  /OU f D CP +  tmin twid le{ +   0 1 ncol{cdesc E get dup 0 get twidth div twid mul 0 E put}for +   /twidth twid D +  }if +  CP printcap CP E pop sub /caphig E D pop +  0 1 1{ +   /pass E D +   0 1 nrow{ +    /irow E D +    /cells rdesc irow get 6 get D +    0 1 ncol{ +     /icol E D +     /cell cells icol get D +     cell 0 ne{ +      cell aload pop /ang E D /CB E D pop pop pop +      /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D +      /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D +      /cmin E D /proc E D +      rspan 0 eq{/rspan nrow irow sub 1 add D}if +      cspan 0 eq{/cspan ncol icol sub 1 add D}if +      /W 0 D +      0 1 cspan 1 sub{icol add cdesc E get 0 get /W E W add D}for +      pass 0 eq rspan 1 eq and pass 1 eq rspan 1 gt and or{ +       ctype 1 eq{() BD}if +       /W W left sub right sub D /XO 0 D /EO 0 D SI +       /A0 align D RC align NA +       AT 4 eq{ +        /DC dp D /DO 0 D /ID 1 D +        0 1 DV length 1 sub{DV E get dup DO gt{/DO E D}{pop}ie}for +        /Lo DO DV 0 get sub D /L1 Lo D +       }if +       0 0 M /BP t D /Fl t D /MF 0 D /FB 0 D +       proc exec T not{/CI 0 D}if BN 0 FB neg R MF 0 eq{/MF CS D}if +       CP /thishig E neg bot add top add CI add D pop +       ang 0 ne{/thishig LM bot add top add D}if +       cell 16 MF put cell 17 Ya put cell 18 thishig put +       valign 4 eq{ +        /below thishig Ya sub D +        rdesc irow get dup dup 4 get Ya lt +         {4 Ya put}{4 get /Ya E D}ie +        dup 5 get below lt{5 below put}{5 get /below E D}ie +        /thishig Ya below add D +       }if +       ctype 1 eq{()ES}if +       /oldhig 0 D +       0 1 rspan 1 sub{ +        irow add rdesc E get 0 get /oldhig E oldhig add D +       }for +       thishig oldhig ge{ +        0 1 rspan 1 sub{ +         irow add rdesc E get dup 0 E 0 get oldhig 0 eq +          {pop thishig rspan div}{thishig mul oldhig div}ie +         put +        }for +       }if +      }if +     }if +    }for +   }for +  }for M RC %ZF +  /thight 0 D /racc 0 D /maxh 0 D /brk 0 D /rbeg nhead nfoot add D +  0 1 nrow{ +   rdesc E get dup 0 get dup /thight E thight add D +   brk 0 eq{/racc E D}{/racc E racc add D}ie +   racc maxh gt{/maxh racc D}if 2 get /brk E D +  }for +  ph 3 ge{thight caphig add E}if +  ph 0 eq ph 4 eq or{ +   /PH 4 D /LE Le D /OU Ou D /yoff 0 D /headsz 0 D +   0 1 nhead 1 sub{rdesc E get 0 get headsz add /headsz E D}for +   /footsz 0 D +   0 1 nfoot 1 sub{rdesc E nhead add get 0 get footsz add /footsz E D}for +   /ahig LE BO add MI add D /maxh maxh headsz add footsz add D +   /thight thight headsz add footsz add D +   tmin avail gt maxh ahig gt or +    {/Sf avail tmin div dup ahig maxh div gt{pop ahig maxh div}if D /SA t D} +    {/Sf 1 D}ie +   tclass 1 eq thight LE 15 sub gt and +    {/SA t D LE 15 sub thight div dup Sf lt{/Sf E D}{pop}ie}if +   SA{Sf Sf scale /ll ll Sf div D /xo xo Sf div D /LE LE Sf div D +    /mr mr Sf div D /BO BO Sf div D /ahig ahig Sf div D}if +   nhead nfoot add getwid +   LE CP E pop add capalg 0 eq{caphig sub}if +   bT{f}{dup thight lt thight ahig lt and}ie +   E headsz sub footsz sub rwid lt or{NP}if +   capalg 0 eq{printcap -8 SP}if +   CP /ycur E D pop +   printhead +   rbeg 1 nrow{/row E D row +    getwid +    ycur yoff add rwid sub footsz sub LE add 0 lt +    {nfoot 0 gt{printfoot}if Tf NP /rbeg irow1 D +     Ba{MI /MI MI SA{Sf div}if D MI SP /MI E D}if +     CP /ycur E D pop /yoff 0 D printhead}if +    irow1 printrow +   }for +   printfoot /row row 1 add D Tf +   0 ycur yoff add M +   capalg 1 eq{/EO 0 D SI -3 SP printcap}if +   Sf 1 lt{1 Sf div dup scale /ll ll Sf mul D /xo xo Sf mul D /LE LE Sf mul D +    /mr mr Sf mul D /BO BO Sf mul D /SA f D}if +   /EO 0 D +  }if + }ie + /W w D /XO xo D /MR mr D /LL ll D /LG lg D /AI ai D /BC bc D /NR nr D /AR ar D + /TR tr D /UI ui D /PH ph D /A0 a0 D /PF pf D /AT at D /AV av D /AL al D + /La la D + /SL SL 1 sub NN D /CF 0 D /FN 0 D SZ SL get FR SL get FS Wf not{()F2}if + PL 2 ge{Ms E restore Ms or /Ms E D PH 1 eq PH 2 eq or +  {/LM E D}if PH 3 ge{/CI 0 D NL 0 E neg R}if + }if + /PL PL 1 sub D /CI 0 D /BP f D /PO f D () Bm 21 get Ts mul BE BL %CF CS SF +} D +/printcap{ + capalg 0 ge{ +  SA{/W w Sf div D} +   {talign 1 eq{/XO xo ll twidth sub 2 div add D}if +    talign 2 eq{/XO xo ll twidth sub add D}if +    /W XO twidth add D +   }ie /XO xo D /LL W XO sub MR sub D +  /PA f D /Fl capalg 0 eq D +  1 NA BL caption exec BN OA /PA t D + }if +} D +/getwid{ + /irow1 E D + /irow2 irow1 D + /rwid 0 D + {rdesc irow2 get dup 0 get rwid add /rwid E D 2 get 0 eq +  {exit}{/irow2 irow2 1 add D}ie + }loop +} D +/printrow{ + /xoff ll twidth PL 2 ge{Sf div}if sub talign mul 2 div D + /xleft xoff xo add D + /irow E D + /cells rdesc irow get 6 get D + 0 1 ncol{ +  /icol E D +  /cell cells icol get D +  cell 0 ne{ +   cell aload pop /ang E D /CB E D /cvsize E D /above E D /fontsz E D +   /DV E D /bot E D /top E D /right E D /left E D /nowrap E D /valign E D +   /dp E D /align E D /rspan E D /cspan E D /cclass E D /ctype E D /cmax E D +   /cmin E D /proc E D +   rspan 0 eq{/rspan nrow irow sub 1 add D}if +   cspan 0 eq{/cspan ncol icol sub 1 add D}if +   /width 0 D +   0 1 cspan 1 sub{icol add cdesc E get 0 get /width E width add D}for +   /rhight rdesc irow get 0 get D +   /hight rhight D +   1 1 rspan 1 sub{irow add rdesc E get 0 get /hight E hight add D}for +   /W xo xoff add width add right sub D +   ang 0 ne{/W xo xoff add hight add right sub D}if +   /EO xo xoff add left add D SI +   Cf{ +    gsave CB VC xo xoff add ycur yoff add M +    0 hight neg RL width 0 RL 0 hight RL width neg 0 RL fill +    grestore +   }if +   ctype 1 eq{() BD}if +   /A0 align D RC +   AT 4 eq{ +    /DC dp D /ID 1 D /DO cdesc icol get 5 get D /Lo DO DV 0 get sub D /L1 Lo D +   }if +   ang 0 ne{ +    gsave ang 90 eq +     {xoff ycur add hight cvsize sub 2 div sub ycur hight sub xoff sub} +     {xoff ycur sub width add hight cvsize sub 2 div add ycur xoff add}ie +    translate ang rotate +   }if +   valign 3 le{0 ycur yoff add top sub +    hight cvsize sub valign 1 sub mul 2 div sub M} +   {0 ycur yoff add top sub above add rdesc irow get 4 get sub M}ie +   /PA f D /BP t D /Fl t D +   BL proc exec BN +   ang 0 ne{grestore}if +   /PA t D +   ctype 1 eq{() ES}if +  }if +  /xoff xoff cdesc icol get 0 get add D + }for + /yoff yoff rhight sub D +} D +/printhead {0 1 nhead 1 sub{printrow}for} D +/printfoot {nhead 1 nhead nfoot add 1 sub{printrow}for} D +/Tf { + OU{rules 2 ge{/yoff 0 D +   gsave 0 Sg +   [0 1 nhead 1 sub{}for rbeg 1 row 1 sub{}for nhead 1 nhead nfoot add 1 sub{}for]{ +    /irow E D +    /xoff ll twidth PL 2 ge{Sf div}if sub talign mul 2 div D +    /cells rdesc irow get 6 get D +    0 1 ncol{ +     /icol E D +     /cell cells icol get D +     cell 0 ne{ +      /rspan cell 6 get D +      /cspan cell 5 get D +      rspan 0 eq{/rspan nrow irow sub 1 add D}if +      cspan 0 eq{/cspan ncol icol sub 1 add D}if +      /width 0 D +      0 1 cspan 1 sub{icol add cdesc E get 0 get /width E width add D}for +      /rhight rdesc irow get 0 get D +      /hight rhight D +      1 1 rspan 1 sub{irow add rdesc E get 0 get /hight E hight add D}for +      xo xoff add width add ycur yoff add M +      0 hight neg icol cspan add 1 sub ncol lt +       {cdesc icol 1 add get 4 get dup rules 3 le{1 eq}{pop t}ie +        {1 eq{0.8}{0.3}ie +        LW RL CP stroke M}{pop R}ie}{R}ie +      irow nhead nfoot add 1 sub ne nfoot 0 eq or +       {irow rspan add 1 sub nrow lt +       {rdesc irow rspan add get 3 get}{nfoot 0 eq{0}{1}ie}ie +       dup rules 2 mod 0 eq{1 eq}{pop t}ie +       {1 eq irow rspan add nhead eq or irow rspan add row eq nfoot 0 gt and or +        {0.8}{0.3}ie LW width neg 0 RL CP stroke M}{pop}ie}if +     }if +     /xoff xoff cdesc icol get 0 get add D +    }for +    /yoff yoff rhight sub D +   }forall +   grestore +   /Ms t D +  }if +  frame 1 gt{ +   gsave +   1 LW 0 Sg +   xleft ycur M CP BB +   0 yoff frame 5 eq frame 7 ge or{RL}{R}ie +   twidth 0 frame 3 eq frame 4 eq or frame 8 ge or{RL}{R}ie CP BB +   0 yoff neg frame 6 ge{RL}{R}ie +   twidth neg 0 frame 2 eq frame 4 eq or frame 8 ge or{RL}{R}ie +   closepath stroke +   grestore +   /Ms t D +  }if + }if +} D +/tables [[[0 0 0 0 0 -1 0 0 1 58 2 0 0 9 5 {()} -1] + [[0 0 0 0 0 0 0][0 0 0 0 0 0 0][0 0 0 0 0 0 0]] + [[0 0 0 0 0 0 [[{()1 Sl()WB(XML Schema type)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(Alias in the )SM(xml_schema)ES( names)HY(pace)YH()} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(C++ type +    )} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(anyType and anySim)HY(ple)HY(Type)YH( types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(anyType)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(type)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 24 1 A(Section 2.5.2, "Mapping for )SM(anyType)ES(")24 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(anySim)HY(ple)HY(Type)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(simple_type)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 25 1 A(Section 2.5.3, "Mapping for )SM(anySim)HY(ple)HY(Type)YH()ES(")25 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(fixed-length inte)HY(gral)YH( types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(byte)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(byte)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(signed\240char)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(unsigned)HY(Byte)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(unsigned_byte)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(unsigned\240char)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(short)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(short_)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(short)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(unsigned)HY(Short)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(unsigned_short)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(unsigned\240short)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(int)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(int_)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(int)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(unsignedInt)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(unsigned_int)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(unsigned\240int)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(long)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(long_)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(long\240long)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(unsigned)HY(Long)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(unsigned_long)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(unsigned\240long\240long)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(arbi)HY(trary)YH(-length inte)HY(gral)YH( types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(integer)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(integer)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(long\240long)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(nonPos)HY(i)HY(tiveIn)HY(te)HY(ger)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(non_posi)HY(tive)YH(_integer)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(long\240long)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(nonNeg)HY(a)HY(tiveIn)HY(te)HY(ger)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(non_nega)HY(tive)YH(_integer)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(unsigned long\240long)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(posi)HY(tiveIn)HY(te)HY(ger)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(posi)HY(tive)YH(_integer)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(unsigned long\240long)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(nega)HY(tiveIn)HY(te)HY(ger)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(nega)HY(tive)YH(_integer)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(long\240long)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(boolean types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(boolean)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(boolean)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(bool)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(fixed-preci)HY(sion)YH( float)HY(ing)YH(-point types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(float)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(float_)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(float)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(double)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(double_)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(double)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(arbi)HY(trary)YH(-preci)HY(sion)YH( float)HY(ing)YH(-point types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(decimal)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(decimal)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(double)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(string types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(string)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(string)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(std::basic_string)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(normal)HY(ized)HY(String)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(normal)HY(ized)YH(_string)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(string)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(token)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(token)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type\240derived\240from\240)SM(normal)HY(ized)YH(_string)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(Name)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(name)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(token)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(NMTOKEN)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(nmtoken)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(token)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(NMTO)HY(KENS)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(nmto)HY(kens)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(sequence<nmtoken>)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(NCName)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(ncname)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(name)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(language)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(language)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(token)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(qual)HY(i)HY(fied)YH( name +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(QName)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(qname)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 26 1 A(Section 2.5.4, "Mapping for )SM(QName)ES(")26 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(ID/IDREF types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(ID)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(id)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(ncname)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(IDREF)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(idref)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 27 1 A(Section 2.5.5, "Mapping for )SM(IDREF)ES(")27 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(IDREFS)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(idrefs)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(sequence<idref>)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(URI types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(anyURI)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(uri)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(std::basic_string)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(binary types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 1 0 0 0 [[{()1 Sl()WB()SM(base64Binary)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(base64_binary)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 28 1 A(Section 2.5.6, "Mapping for +         )SM(base64Binary)ES( and )SM(hexBi)HY(nary)YH()ES(")28 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 2 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(hexBi)HY(nary)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(hex_binary)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(date/time types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(date)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(date)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 30 1 A(Section 2.5.8, "Mapping for +          )SM(date)ES(")30 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(date)HY(Time)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(date_time)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 31 1 A(Section 2.5.9, "Mapping for +          )SM(date)HY(Time)YH()ES(")31 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(dura)HY(tion)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(dura)HY(tion)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 32 1 A(Section 2.5.10, "Mapping for +          )SM(dura)HY(tion)YH()ES(")32 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(gDay)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(gday)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 33 1 A(Section 2.5.11, "Mapping for +          )SM(gDay)ES(")33 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(gMonth)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(gmonth)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 34 1 A(Section 2.5.12, "Mapping for +          )SM(gMonth)ES(")34 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(gMon)HY(th)HY(Day)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(gmonth_day)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 35 1 A(Section 2.5.13, "Mapping for +          )SM(gMon)HY(th)HY(Day)YH()ES(")35 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(gYear)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(gyear)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 36 1 A(Section 2.5.14, "Mapping for +          )SM(gYear)ES(")36 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(gYear)HY(Month)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(gyear_month)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 37 1 A(Section 2.5.15, "Mapping for +          )SM(gYear)HY(Month)YH()ES(")37 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(time)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(time)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()0 38 1 A(Section 2.5.16, "Mapping for +          )SM(time)ES(")38 0 TN TL()Ec /AF f D( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB(entity types +    )} 0 0 1 0 3 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +0 +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(ENTITY)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(entity)ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(name)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 0 0 0 0 [[{()1 Sl()WB()SM(ENTI)HY(TIES)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()SM(enti)HY(ties)YH()ES()} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(type derived from )SM(sequence<entity>)ES( +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +]] +[[0 0 0 0 0 -1 0 0 1 8 5 0 0 9 5 {()} -1] + [[0 0 0 0 0 0 0][0 0 0 0 0 0 0][0 0 0 0 0 0 0][0 0 0 0 0 0 0][0 0 0 0 0 0 0][0 0 0 0 0 0 0]] + [[0 0 0 0 0 0 [[{()1 Sl()WB()} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB()} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(default)} 0 0 1 0 2 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +[{()1 Sl()WB(fixed +    )} 0 0 1 0 2 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +]] +[0 0 1 0 0 0 [[{()1 Sl()WB(element)} 0 0 1 0 1 4 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(not present)} 0 0 1 0 1 2 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(optional)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(required)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(optional)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(required +    )} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 1 0 0 0 [0 +0 +[{()1 Sl()WB(not present)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(invalid instance)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(not present)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(invalid instance +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 1 0 0 0 [0 +[{()1 Sl()WB(empty)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(default value is used)} 0 0 0 0 2 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +[{()1 Sl()WB(fixed value is used +    )} 0 0 0 0 2 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +]] +[0 0 0 0 0 0 [0 +[{()1 Sl()WB(value)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(value is used)} 0 0 0 0 2 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +[{()1 Sl()WB(value is used provided it's the same as fixed +    )} 0 0 0 0 2 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +]] +[0 0 1 0 0 0 [[{()1 Sl()WB(attribute)} 0 0 1 0 1 4 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(not present)} 0 0 1 0 1 2 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(optional)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(required)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(optional)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(required +    )} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 1 0 0 0 [0 +0 +[{()1 Sl()WB(default value is used)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(invalid schema)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(fixed value is used)} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(invalid instance +    )} 0 0 0 0 1 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +]] +[0 0 1 0 0 0 [0 +[{()1 Sl()WB(empty)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(empty value is used)} 0 0 0 0 2 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +[{()1 Sl()WB(empty value is used provided it's the same as fixed +    )} 0 0 0 0 2 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +]] +[0 0 0 0 0 0 [0 +[{()1 Sl()WB(value)} 0 0 1 0 1 1 1 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +[{()1 Sl()WB(value is used)} 0 0 0 0 2 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +[{()1 Sl()WB(value is used provided it's the same as fixed +    )} 0 0 0 0 2 1 0 (.) 2 0 4 4 2 6 0 0 0 0 Db 0 ] +0 +]] +]] +] D +0 1 1{TS}for RC ZF +/Ba f D /BO 0 D Bs +/UR (/home/boris/work/xsd/xsd/doc/cxx/tree/manual/index.xhtml) D +/Ti (C++/Tree Mapping User Manual) D +/Au () D +/Df f D +/ME [(4.0.0)] D +Pt +/BO 0 D TC /Ba f D Bs /AU f D /UR () D RC ZF + tH WB +ND 1 gt{Ts 3 mul Np 0()0 C()BD(C++/Tree Mapping User Manual)ES()0 1 TN()EA()BN}if +1 NH le{97(1\240\240)1 C(Preface)WB 3 Sn()97 1 TN()EA()BN}if +2 NH le{98(1.1\240\240)2 C(About)WB 4 Sn( This Docu)HY(ment)YH()98 1 TN()EA()BN}if +2 NH le{99(1.2\240\240)2 C(More)WB 5 Sn( Infor)HY(ma)HY(tion)YH()99 1 TN()EA()BN}if +1 NH le{100(2\240\240)1 C(1)WB 6 Sn( Intro)HY(duc)HY(tion)YH()100 1 TN()EA()BN}if +1 NH le{101(3\240\240)1 C(2)WB 7 Sn( C++/Tree Mapping)101 1 TN()EA()BN}if +2 NH le{102(3.1\240\240)2 C(2.1)WB 8 Sn( Prelim)HY(i)HY(nary)YH( Infor)HY(ma)HY(tion)YH()102 1 TN()EA()BN}if +3 NH le{103(3.1.1\240\240)3 C(2.1.1)WB 9 Sn( C++ Stan)HY(dard)YH()103 1 TN()EA()BN}if +3 NH le{104(3.1.2\240\240)3 C(2.1.2)WB 10 Sn( Iden)HY(ti)HY(fiers)YH()104 1 TN()EA()BN}if +3 NH le{105(3.1.3\240\240)3 C(2.1.3)WB 11 Sn( Char)HY(ac)HY(ter)YH( Type and Encod)HY(ing)YH()105 1 TN()EA()BN}if +3 NH le{106(3.1.4\240\240)3 C(2.1.4)WB 12 Sn( XML Schema Names)HY(pace)YH()106 1 TN()EA()BN}if +3 NH le{107(3.1.5\240\240)3 C(2.1.5)WB 13 Sn( Anony)HY(mous)YH( Types)107 1 TN()EA()BN}if +2 NH le{108(3.2\240\240)2 C(2.2)WB 14 Sn( Error Handling)108 1 TN()EA()BN}if +3 NH le{109(3.2.1\240\240)3 C(2.2.1)WB 15 Sn( )SM(xml_schema::dupli)HY(cate)YH(_id)ES()109 1 TN()EA()BN}if +2 NH le{110(3.3\240\240)2 C(2.3)WB 16 Sn( Mapping for )SM(import)ES( and )SM(include)ES()110 1 TN()EA()BN}if +3 NH le{111(3.3.1\240\240)3 C(2.3.1)WB 17 Sn( Import)111 1 TN()EA()BN}if +3 NH le{112(3.3.2\240\240)3 C(2.3.2)WB 18 Sn( Inclu)HY(sion)YH( with Target Names)HY(pace)YH()112 1 TN()EA()BN}if +3 NH le{113(3.3.3\240\240)3 C(2.3.3)WB 19 Sn( Inclu)HY(sion)YH( without Target Names)HY(pace)YH()113 1 TN()EA()BN}if +2 NH le{114(3.4\240\240)2 C(2.4)WB 20 Sn( Mapping for Names)HY(paces)YH()114 1 TN()EA()BN}if +2 NH le{115(3.5\240\240)2 C(2.5)WB 21 Sn( Mapping for Built-in Data Types)115 1 TN()EA()BN}if +3 NH le{116(3.5.1\240\240)3 C(2.5.1)WB 23 Sn( Inher)HY(i)HY(tance)YH( from Built-in Data Types)116 1 TN()EA()BN}if +3 NH le{117(3.5.2\240\240)3 C(2.5.2)WB 24 Sn( Mapping for )SM(anyType)ES()117 1 TN()EA()BN}if +3 NH le{118(3.5.3\240\240)3 C(2.5.3)WB 25 Sn( Mapping for )SM(anySim)HY(ple)HY(Type)YH()ES()118 1 TN()EA()BN}if +3 NH le{119(3.5.4\240\240)3 C(2.5.4)WB 26 Sn( Mapping for )SM(QName)ES()119 1 TN()EA()BN}if +3 NH le{120(3.5.5\240\240)3 C(2.5.5)WB 27 Sn( Mapping for )SM(IDREF)ES()120 1 TN()EA()BN}if +3 NH le{121(3.5.6\240\240)3 C(2.5.6)WB 28 Sn( Mapping for )SM(base64Binary)ES( and +      )SM(hexBi)HY(nary)YH()ES()121 1 TN()EA()BN}if +2 NH le{122(3.6\240\240)2 C(2.5.7)WB 29 Sn( Time Zone Repre)HY(sen)HY(ta)HY(tion)YH()122 1 TN()EA()BN}if +2 NH le{123(3.7\240\240)2 C(2.5.8)WB 30 Sn( Mapping for )SM(date)ES()123 1 TN()EA()BN}if +2 NH le{124(3.8\240\240)2 C(2.5.9)WB 31 Sn( Mapping for )SM(date)HY(Time)YH()ES()124 1 TN()EA()BN}if +2 NH le{125(3.9\240\240)2 C(2.5.10)WB 32 Sn( Mapping for )SM(dura)HY(tion)YH()ES()125 1 TN()EA()BN}if +2 NH le{126(3.10\240\240)2 C(2.5.11)WB 33 Sn( Mapping for )SM(gDay)ES()126 1 TN()EA()BN}if +2 NH le{127(3.11\240\240)2 C(2.5.12)WB 34 Sn( Mapping for )SM(gMonth)ES()127 1 TN()EA()BN}if +2 NH le{128(3.12\240\240)2 C(2.5.13)WB 35 Sn( Mapping for )SM(gMon)HY(th)HY(Day)YH()ES()128 1 TN()EA()BN}if +2 NH le{129(3.13\240\240)2 C(2.5.14)WB 36 Sn( Mapping for )SM(gYear)ES()129 1 TN()EA()BN}if +2 NH le{130(3.14\240\240)2 C(2.5.15)WB 37 Sn( Mapping for )SM(gYear)HY(Month)YH()ES()130 1 TN()EA()BN}if +2 NH le{131(3.15\240\240)2 C(2.5.16)WB 38 Sn( Mapping for )SM(time)ES()131 1 TN()EA()BN}if +2 NH le{132(3.16\240\240)2 C(2.6)WB 39 Sn( Mapping for Simple Types)132 1 TN()EA()BN}if +3 NH le{133(3.16.1\240\240)3 C(2.6.1)WB 40 Sn( Mapping for Deriva)HY(tion)YH( by Restric)HY(tion)YH()133 1 TN()EA()BN}if +3 NH le{134(3.16.2\240\240)3 C(2.6.2)WB 41 Sn( Mapping for Enumer)HY(a)HY(tions)YH()134 1 TN()EA()BN}if +3 NH le{135(3.16.3\240\240)3 C(2.6.3)WB 42 Sn( Mapping for Deriva)HY(tion)YH( by List)135 1 TN()EA()BN}if +3 NH le{136(3.16.4\240\240)3 C(2.6.4)WB 43 Sn( Mapping for Deriva)HY(tion)YH( by Union)136 1 TN()EA()BN}if +2 NH le{137(3.17\240\240)2 C(2.7)WB 44 Sn( Mapping for Complex Types)137 1 TN()EA()BN}if +3 NH le{138(3.17.1\240\240)3 C(2.7.1)WB 45 Sn( Mapping for Deriva)HY(tion)YH( by Exten)HY(sion)YH()138 1 TN()EA()BN}if +3 NH le{139(3.17.2\240\240)3 C(2.7.2)WB 46 Sn( Mapping for Deriva)HY(tion)YH( by Restric)HY(tion)YH()139 1 TN()EA()BN}if +2 NH le{140(3.18\240\240)2 C(2.8)WB 47 Sn( Mapping for Local Elements and Attributes)140 1 TN()EA()BN}if +3 NH le{141(3.18.1\240\240)3 C(2.8.1)WB 48 Sn( Mapping for Members with the One Cardi)HY(nal)HY(ity)YH( Class)141 1 TN()EA()BN}if +3 NH le{142(3.18.2\240\240)3 C(2.8.2)WB 49 Sn( Mapping for Members with the Optional Cardi)HY(nal)HY(ity)YH( Class)142 1 TN()EA()BN}if +3 NH le{143(3.18.3\240\240)3 C(2.8.3)WB 50 Sn( Mapping for Members with the Sequence Cardi)HY(nal)HY(ity)YH( Class)143 1 TN()EA()BN}if +3 NH le{144(3.18.4\240\240)3 C(2.8.4)WB 51 Sn( Element Order)144 1 TN()EA()BN}if +2 NH le{145(3.19\240\240)2 C(2.9)WB 52 Sn( Mapping for Global Elements)145 1 TN()EA()BN}if +3 NH le{146(3.19.1\240\240)3 C(2.9.1)WB 53 Sn( Element Types)146 1 TN()EA()BN}if +3 NH le{147(3.19.2\240\240)3 C(2.9.2)WB 54 Sn( Element Map)147 1 TN()EA()BN}if +2 NH le{148(3.20\240\240)2 C(2.10)WB 55 Sn( Mapping for Global Attributes)148 1 TN()EA()BN}if +2 NH le{149(3.21\240\240)2 C(2.11)WB 56 Sn( Mapping for )SM(xsi:type)ES( and Substi)HY(tu)HY(tion)YH( +      Groups)149 1 TN()EA()BN}if +2 NH le{150(3.22\240\240)2 C(2.12)WB 57 Sn( Mapping for )SM(any)ES( and )SM(anyAt)HY(tribute)YH()ES()150 1 TN()EA()BN}if +3 NH le{151(3.22.1\240\240)3 C(2.12.1)WB 58 Sn( Mapping for )SM(any)ES( with the One Cardi)HY(nal)HY(ity)YH( Class)151 1 TN()EA()BN}if +3 NH le{152(3.22.2\240\240)3 C(2.12.2)WB 59 Sn( Mapping for )SM(any)ES( with the Optional Cardi)HY(nal)HY(ity)YH( Class)152 1 TN()EA()BN}if +3 NH le{153(3.22.3\240\240)3 C(2.12.3)WB 60 Sn( Mapping for )SM(any)ES( with the Sequence Cardi)HY(nal)HY(ity)YH( Class)153 1 TN()EA()BN}if +3 NH le{154(3.22.4\240\240)3 C(2.12.4)WB 61 Sn( Element Wild)HY(card)YH( Order)154 1 TN()EA()BN}if +3 NH le{155(3.22.5\240\240)3 C(2.12.5)WB 62 Sn( Mapping for )SM(anyAt)HY(tribute)YH()ES()155 1 TN()EA()BN}if +2 NH le{156(3.23\240\240)2 C(2.13)WB 63 Sn( Mapping for Mixed Content Models)156 1 TN()EA()BN}if +1 NH le{157(4\240\240)1 C(3)WB 64 Sn( Parsing)157 1 TN()EA()BN}if +2 NH le{158(4.1\240\240)2 C(3.1)WB 65 Sn( Initial)HY(iz)HY(ing)YH( the Xerces-C++ Runtime)158 1 TN()EA()BN}if +2 NH le{159(4.2\240\240)2 C(3.2)WB 66 Sn( Flags and Prop)HY(er)HY(ties)YH()159 1 TN()EA()BN}if +2 NH le{160(4.3\240\240)2 C(3.3)WB 67 Sn( Error Handling)160 1 TN()EA()BN}if +3 NH le{161(4.3.1\240\240)3 C(3.3.1)WB 68 Sn( )SM(xml_schema::parsing)ES()161 1 TN()EA()BN}if +3 NH le{162(4.3.2\240\240)3 C(3.3.2)WB 69 Sn( )SM(xml_schema::expected_element)ES()162 1 TN()EA()BN}if +3 NH le{163(4.3.3\240\240)3 C(3.3.3)WB 70 Sn( )SM(xml_schema::unex)HY(pected)YH(_element)ES()163 1 TN()EA()BN}if +3 NH le{164(4.3.4\240\240)3 C(3.3.4)WB 71 Sn( )SM(xml_schema::expected_attribute)ES()164 1 TN()EA()BN}if +3 NH le{165(4.3.5\240\240)3 C(3.3.5)WB 72 Sn( )SM(xml_schema::unex)HY(pected)YH(_enumer)HY(a)HY(tor)YH()ES()165 1 TN()EA()BN}if +3 NH le{166(4.3.6\240\240)3 C(3.3.6)WB 73 Sn( )SM(xml_schema::expected_text_content)ES()166 1 TN()EA()BN}if +3 NH le{167(4.3.7\240\240)3 C(3.3.7)WB 74 Sn( )SM(xml_schema::no_type_info)ES()167 1 TN()EA()BN}if +3 NH le{168(4.3.8\240\240)3 C(3.3.8)WB 75 Sn( )SM(xml_schema::not_derived)ES()168 1 TN()EA()BN}if +3 NH le{169(4.3.9\240\240)3 C(3.3.9)WB 76 Sn( )SM(xml_schema::no_prefix_mapping)ES()169 1 TN()EA()BN}if +2 NH le{170(4.4\240\240)2 C(3.4)WB 77 Sn( Reading from a Local File or URI)170 1 TN()EA()BN}if +2 NH le{171(4.5\240\240)2 C(3.5)WB 78 Sn( Reading from )SM(std::istream)ES()171 1 TN()EA()BN}if +2 NH le{172(4.6\240\240)2 C(3.6)WB 79 Sn( Reading from )SM(xercesc::Input)HY(Source)YH()ES()172 1 TN()EA()BN}if +2 NH le{173(4.7\240\240)2 C(3.7)WB 80 Sn( Reading from DOM)173 1 TN()EA()BN}if +1 NH le{174(5\240\240)1 C(4)WB 81 Sn( Seri)HY(al)HY(iza)HY(tion)YH()174 1 TN()EA()BN}if +2 NH le{175(5.1\240\240)2 C(4.1)WB 82 Sn( Initial)HY(iz)HY(ing)YH( the Xerces-C++ Runtime)175 1 TN()EA()BN}if +2 NH le{176(5.2\240\240)2 C(4.2)WB 83 Sn( Names)HY(pace)YH( Infomap and Char)HY(ac)HY(ter)YH( Encod)HY(ing)YH()176 1 TN()EA()BN}if +2 NH le{177(5.3\240\240)2 C(4.3)WB 84 Sn( Flags)177 1 TN()EA()BN}if +2 NH le{178(5.4\240\240)2 C(4.4)WB 85 Sn( Error Handling)178 1 TN()EA()BN}if +3 NH le{179(5.4.1\240\240)3 C(4.4.1)WB 86 Sn( )SM(xml_schema::seri)HY(al)HY(iza)HY(tion)YH()ES()179 1 TN()EA()BN}if +3 NH le{180(5.4.2\240\240)3 C(4.4.2)WB 87 Sn( )SM(xml_schema::unex)HY(pected)YH(_element)ES()180 1 TN()EA()BN}if +3 NH le{181(5.4.3\240\240)3 C(4.4.3)WB 88 Sn( )SM(xml_schema::no_type_info)ES()181 1 TN()EA()BN}if +2 NH le{182(5.5\240\240)2 C(4.5)WB 89 Sn( Seri)HY(al)HY(iz)HY(ing)YH( to )SM(std::ostream)ES()182 1 TN()EA()BN}if +2 NH le{183(5.6\240\240)2 C(4.6)WB 90 Sn( Seri)HY(al)HY(iz)HY(ing)YH( to )SM(xercesc::XMLFor)HY(mat)HY(Tar)HY(get)YH()ES()183 1 TN()EA()BN}if +2 NH le{184(5.7\240\240)2 C(4.7)WB 91 Sn( Seri)HY(al)HY(iz)HY(ing)YH( to DOM)184 1 TN()EA()BN}if +1 NH le{185(6\240\240)1 C(5)WB 92 Sn( Addi)HY(tional)YH( Func)HY(tion)HY(al)HY(ity)YH()185 1 TN()EA()BN}if +2 NH le{186(6.1\240\240)2 C(5.1)WB 93 Sn( DOM Asso)HY(ci)HY(a)HY(tion)YH()186 1 TN()EA()BN}if +2 NH le{187(6.2\240\240)2 C(5.2)WB 94 Sn( Binary Seri)HY(al)HY(iza)HY(tion)YH()187 1 TN()EA()BN}if +1 NH le{188(7\240\240)1 C(Appendix)WB 95 Sn( A \236 Default and Fixed Values)188 1 TN()EA()BN}if +/OU t D /Cb Db D NP Ep ET  +/Cb Db D /Ct [16#00 16#00 16#00] D /Cl [16#00 16#00 16#00] D /CL -1 D Ct Sc + +/Ba f D /BO 0 D Bs +/UR (/home/boris/work/xsd/xsd/doc/cxx/tree/manual/index.xhtml) D +/Ti (C++/Tree Mapping User Manual) D +/Au () D +/Df f D +/ME [(4.0.0)] D + +NP RC ZF +()1 Sl()WB 0 Sn( + +)BR()WB 1 Sn(  )BR()WB 2 Sn( +   + +  )0 1 0 H(Preface)WB 97 Sn()WB 3 Sn()EA()EH( + +  )0 2 1 H(About)WB 98 Sn()WB 4 Sn( This Docu)HY(ment)YH()EA()EH( + +  )0 P(This docu)HY(ment)YH( describes the mapping of W3C XML Schema +     to the C++ program)HY(ming)YH( language as imple)HY(mented)YH( by +     )R1 2 A(CodeSyn)HY(the)HY(sis)YH( +     XSD)EA( - an XML Schema to C++ data binding compiler. The mapping +     repre)HY(sents)YH( infor)HY(ma)HY(tion)YH( stored in XML instance docu)HY(ments)YH( as a +     stat)HY(i)HY(cally)YH(-typed, tree-like in-memory data struc)HY(ture)YH( and is +     called C++/Tree. +  )EP( + +  )0 P(Revi)HY(sion)YH( 4.0.0)BR(  +     This revi)HY(sion)YH( of the manual describes the C++/Tree +     mapping as imple)HY(mented)YH( by CodeSyn)HY(the)HY(sis)YH( XSD version 4.0.0. +  )EP( + +  )0 P(This docu)HY(ment)YH( is avail)HY(able)YH( in the follow)HY(ing)YH( formats: +     )R2 2 A(XHTML)EA(, +     )R3 2 A(PDF)EA(, and +     )R4 2 A(PostScript)EA(.)EP( + +  )0 2 2 H(More)WB 99 Sn()WB 5 Sn( Infor)HY(ma)HY(tion)YH()EA()EH( + +  )0 P(Beyond this manual, you may also find the follow)HY(ing)YH( sources of +     infor)HY(ma)HY(tion)YH( useful:)EP( + +  )UL(    )-1 LI()R5 2 A(C++/Tree +        Mapping Getting Started Guide)EA( + +    )-1 LI()R6 2 A(C++/Tree +        Mapping Customiza)HY(tion)YH( Guide)EA( + +    )-1 LI()R7 2 A(C++/Tree +        Mapping Frequently Asked Ques)HY(tions)YH( \201FAQ\202)EA( + +    )-1 LI()R8 2 A(XSD +        Compiler Command Line Manual)EA( + +    )-1 LI(The )SM(exam)HY(ples)YH(/cxx/tree/)ES( direc)HY(tory)YH( in the XSD +        distri)HY(bu)HY(tion)YH( contains a collec)HY(tion)YH( of exam)HY(ples)YH( and a README +        file with an overview of each example. + +    )-1 LI(The )SM(README)ES( file in the XSD distri)HY(bu)HY(tion)YH( explains +        how to compile the exam)HY(ples)YH( on various plat)HY(forms)YH(. + +    )-1 LI(The )R9 2 A(xsd-users)EA( +        mailing list is a place to ask ques)HY(tions)YH(. Further)HY(more)YH( the +        )R10 2 A(archives)EA( +        may already have answers to some of your ques)HY(tions)YH(. +  )LU( + + +  )0 1 3 H(1)WB 100 Sn()WB 6 Sn( Intro)HY(duc)HY(tion)YH()EA()EH( + +  )0 P(C++/Tree is a W3C XML Schema to C++ mapping that repre)HY(sents)YH( the +     data stored in XML as a stat)HY(i)HY(cally)YH(-typed, vocab)HY(u)HY(lary)YH(-specific +     object model. Based on a formal descrip)HY(tion)YH( of an XML vocab)HY(u)HY(lary)YH( +     \201schema\202, the C++/Tree mapping produces a tree-like data struc)HY(ture)YH( +     suit)HY(able)YH( for in-memory process)HY(ing)YH( as well as XML parsing and +     seri)HY(al)HY(iza)HY(tion)YH( code.)EP( + +  )0 P(A typical appli)HY(ca)HY(tion)YH( that processes XML docu)HY(ments)YH( usually +     performs the follow)HY(ing)YH( three steps: it first reads \201parses\202 an XML +     instance docu)HY(ment)YH( to an object model, it then performs +     some useful compu)HY(ta)HY(tions)YH( on that model which may involve +     modi)HY(fi)HY(ca)HY(tion)YH( of the model, and finally it may write \201seri)HY(al)HY(ize)YH(\202 +     the modi)HY(fied)YH( object model back to XML. +  )EP( + +  )0 P(The C++/Tree mapping consists of C++ types that repre)HY(sent)YH( the +     given vocab)HY(u)HY(lary)YH( \201)0 7 1 A(Chapter 2, "C++/Tree Mapping")7 0 TN TL()Ec /AF f D(\202, +     a set of parsing func)HY(tions)YH( that convert XML docu)HY(ments)YH( to +     a tree-like in-memory data struc)HY(ture)YH( \201)0 64 1 A(Chapter 3, +     "Parsing")64 0 TN TL()Ec /AF f D(\202, and a set of seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( that convert +     the object model back to XML \201)0 81 1 A(Chapter 4, +     "Seri)HY(al)HY(iza)HY(tion)YH(")81 0 TN TL()Ec /AF f D(\202. Further)HY(more)YH(, the mapping provides a number +     of addi)HY(tional)YH( features, such as DOM asso)HY(ci)HY(a)HY(tion)YH( and binary +     seri)HY(al)HY(iza)HY(tion)YH(, that can be useful in some appli)HY(ca)HY(tions)YH( +     \201)0 92 1 A(Chapter 5, "Addi)HY(tional)YH( Func)HY(tion)HY(al)HY(ity)YH(")92 0 TN TL()Ec /AF f D(\202. +  )EP( + + +   + + +  )0 1 4 H(2)WB 101 Sn()WB 7 Sn( C++/Tree Mapping)EA()EH( + +  )0 2 5 H(2.1)WB 102 Sn()WB 8 Sn( Prelim)HY(i)HY(nary)YH( Infor)HY(ma)HY(tion)YH()EA()EH( + +  )0 3 6 H(2.1.1)WB 103 Sn()WB 9 Sn( C++ Stan)HY(dard)YH()EA()EH( + +  )0 P(The C++/Tree mapping provides support for ISO/IEC C++ 1998/2003 \201C++98\202 +     and ISO/IEC C++ 2011 \201C++11\202. To select the C++ stan)HY(dard)YH( for the +     gener)HY(ated)YH( code we use the )SM(--std)ES( XSD compiler command +     line option. While the major)HY(ity)YH( of the exam)HY(ples)YH( in this manual use +     C++98, support for the new func)HY(tion)HY(al)HY(ity)YH( and library compo)HY(nents)YH( +     intro)HY(duced)YH( in C++11 are discussed through)HY(out)YH( the docu)HY(ment)YH(.)EP( + +  )0 3 7 H(2.1.2)WB 104 Sn()WB 10 Sn( Iden)HY(ti)HY(fiers)YH()EA()EH( + +  )0 P(XML Schema names may happen to be reserved C++ keywords or contain +     char)HY(ac)HY(ters)YH( that are illegal in C++ iden)HY(ti)HY(fiers)YH(. To avoid C++ compi)HY(la)HY(tion)YH( +     prob)HY(lems)YH(, such names are changed \201escaped\202 when mapped to C++. If an +     XML Schema name is a C++ keyword, the "_" suffix is added to it. All +     char)HY(ac)HY(ter)YH( of an XML Schema name that are not allowed in C++ iden)HY(ti)HY(fiers)YH( +     are replaced with "_". +  )EP( + +  )0 P(For example, XML Schema name )SM(try)ES( will be mapped to +     C++ iden)HY(ti)HY(fier)YH( )SM(try_)ES(. Simi)HY(larly)YH(, XML Schema name +     )SM(strange.na-me)ES( will be mapped to C++ iden)HY(ti)HY(fier)YH( +     )SM(strange_na_me)ES(. +  )EP( + +  )0 P(Further)HY(more)YH(, conflicts between type names and func)HY(tion)YH( names in the +     same scope are resolved using name escap)HY(ing)YH(. Such conflicts include +     both a global element \201which is mapped to a set of parsing and/or +     seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( or element types, see )0 52 1 A(Section +     2.9, "Mapping for Global Elements")52 0 TN TL()Ec /AF f D(\202 and a global type sharing the +     same name as well as a local element or attribute inside a type having +     the same name as the type itself.)EP( + +  )0 P(For example, if we had a global type )SM(catalog)ES( +     and a global element with the same name then the type would be +     mapped to a C++ class with name )SM(catalog)ES( while the +     parsing func)HY(tions)YH( corre)HY(spond)HY(ing)YH( to the global element would have +     their names escaped as )SM(catalog_)ES(. +  )EP( + +  )0 P(By default the mapping uses the so-called K&R \201Kernighan and +     Ritchie\202 iden)HY(ti)HY(fier)YH( naming conven)HY(tion)YH( which is also used through)HY(out)YH( +     this manual. In this conven)HY(tion)YH( both type and func)HY(tion)YH( names are in +     lower case and words are sepa)HY(rated)YH( by under)HY(scores)YH(. If your appli)HY(ca)HY(tion)YH( +     code or schemas use a differ)HY(ent)YH( nota)HY(tion)YH(, you may want to change the +     naming conven)HY(tion)YH( used by the mapping for consis)HY(tency)YH(. +     The compiler supports a set of widely-used naming conven)HY(tions)YH( +     that you can select with the )SM(--type-naming)ES( and +     )SM(--func)HY(tion)YH(-naming)ES( options. You can also further +     refine one of the prede)HY(fined)YH( conven)HY(tions)YH( or create a completely +     custom naming scheme by using the  )SM(--*-regex)ES( options. +     For more detailed infor)HY(ma)HY(tion)YH( on these options refer to the NAMING +     CONVEN)HY(TION)YH( section in the )R8 2 A(XSD +     Compiler Command Line Manual)EA(.)EP( + +  )0 3 8 H(2.1.3)WB 105 Sn()WB 11 Sn( Char)HY(ac)HY(ter)YH( Type and Encod)HY(ing)YH()EA()EH( + +  )0 P(The code that imple)HY(ments)YH( the mapping, depend)HY(ing)YH( on the +     )SM(--char-type)ES(  option, is gener)HY(ated)YH( using either +     )SM(char)ES( or )SM(wchar_t)ES( as the char)HY(ac)HY(ter)YH( +     type. In this docu)HY(ment)YH( code samples use symbol )SM(C)ES( +     to refer to the char)HY(ac)HY(ter)YH( type you have selected when trans)HY(lat)HY(ing)YH( +     your schemas, for example )SM(std::basic_string<C>)ES(. +  )EP( + +  )0 P(Another aspect of the mapping that depends on the char)HY(ac)HY(ter)YH( type +     is char)HY(ac)HY(ter)YH( encod)HY(ing)YH(. For the )SM(char)ES( char)HY(ac)HY(ter)YH( type +     the default encod)HY(ing)YH( is UTF-8. Other supported encod)HY(ings)YH( are +     ISO-8859-1, Xerces-C++ Local Code Page \201LPC\202, as well as +     custom encod)HY(ings)YH( and can be selected with the +     )SM(--char-encod)HY(ing)YH()ES( command line option.)EP( + +  )0 P(For the )SM(wchar_t)ES( char)HY(ac)HY(ter)YH( type the encod)HY(ing)YH( is +     auto)HY(mat)HY(i)HY(cally)YH( selected between UTF-16 and UTF-32/UCS-4 depend)HY(ing)YH( +     on the size of the )SM(wchar_t)ES( type. On some plat)HY(forms)YH( +     \201for example, Windows with Visual C++ and AIX with IBM XL C++\202 +     )SM(wchar_t)ES( is 2 bytes long. For these plat)HY(forms)YH( the +     encod)HY(ing)YH( is UTF-16. On other plat)HY(forms)YH( )SM(wchar_t)ES( is 4 bytes +     long and UTF-32/UCS-4 is used.)EP( + +  )0 3 9 H(2.1.4)WB 106 Sn()WB 12 Sn( XML Schema Names)HY(pace)YH()EA()EH( + +  )0 P(The mapping relies on some prede)HY(fined)YH( types, classes, and func)HY(tions)YH( +     that are logi)HY(cally)YH( defined in the XML Schema names)HY(pace)YH( reserved for +     the XML Schema language \201)SM(http://www.w3.org/2001/XMLSchema)ES(\202. +     By default, this names)HY(pace)YH( is mapped to C++ names)HY(pace)YH( +     )SM(xml_schema)ES(. It is auto)HY(mat)HY(i)HY(cally)YH( acces)HY(si)HY(ble)YH( +     from a C++ compi)HY(la)HY(tion)YH( unit that includes a header file gener)HY(ated)YH( +     from an XML Schema defi)HY(ni)HY(tion)YH(. +  )EP( + +  )0 P(Note that, if desired, the default mapping of this names)HY(pace)YH( can be +     changed as described in )0 20 1 A(Section 2.4, "Mapping for +     Names)HY(paces)YH(")20 0 TN TL()Ec /AF f D(. +  )EP( + + +  )0 3 10 H(2.1.5)WB 107 Sn()WB 13 Sn( Anony)HY(mous)YH( Types)EA()EH( + +  )0 P(For the purpose of code gener)HY(a)HY(tion)YH(, anony)HY(mous)YH( types defined in +     XML Schema are auto)HY(mat)HY(i)HY(cally)YH( assigned names that are derived +     from enclos)HY(ing)YH( attributes and elements. Other)HY(wise)YH(, such types +     follows stan)HY(dard)YH( mapping rules for simple and complex type +     defi)HY(ni)HY(tions)YH( \201see )0 39 1 A(Section 2.6, "Mapping for Simple Types")39 0 TN TL()Ec /AF f D( +     and )0 44 1 A(Section 2.7, "Mapping for Complex Types")44 0 TN TL()Ec /AF f D(\202. +     For example, in the follow)HY(ing)YH( schema frag)HY(ment)YH(: +  )EP( + +  ) 5 23 PR(<element name="object"> +  <complexType> +    ... +  </complexType> +</element>)RP( + +  )0 P(The anony)HY(mous)YH( type defined inside element )SM(object)ES( will +     be given name )SM(object)ES(. The compiler has a number of +     options that control the process of anony)HY(mous)YH( type naming. For more +     infor)HY(ma)HY(tion)YH( refer to the )R8 2 A(XSD +     Compiler Command Line Manual)EA(.)EP( + + +  )0 2 11 H(2.2)WB 108 Sn()WB 14 Sn( Error Handling)EA()EH( + +  )0 P(The mapping uses the C++ excep)HY(tion)YH( handling mech)HY(a)HY(nism)YH( as a primary way +     of report)HY(ing)YH( error condi)HY(tions)YH(. All excep)HY(tions)YH( that are spec)HY(i)HY(fied)YH( in +     this mapping derive from )SM(xml_schema::excep)HY(tion)YH()ES( which +     itself is derived from )SM(std::excep)HY(tion)YH()ES(: +  )EP( + +  ) 14 60 PR(struct exception: virtual std::exception +{ +  friend +  std::basic_ostream<C>& +  operator<< \201std::basic_ostream<C>& os, const exception& e\202 +  { +    e.print \201os\202; +    return os; +  } + +protected: +  virtual void +  print \201std::basic_ostream<C>&\202 const = 0; +};)RP( + +  )0 P(The excep)HY(tion)YH( hier)HY(ar)HY(chy)YH( supports "virtual" )SM(oper)HY(a)HY(tor)YH(<<)ES( +     which allows you to obtain diag)HY(nos)HY(tics)YH( corre)HY(spond)HY(ing)YH( to the thrown +     excep)HY(tion)YH( using the base excep)HY(tion)YH( inter)HY(face)YH(. For example:)EP( + +  ) 8 38 PR(try +{ +  ... +} +catch \201const xml_schema::exception& e\202 +{ +  cerr << e << endl; +})RP( + +  )0 P(The follow)HY(ing)YH( sub-sections describe excep)HY(tions)YH( thrown by the +     types that consti)HY(tute)YH( the object model. +     )0 67 1 A(Section 3.3, "Error Handling")67 0 TN TL()Ec /AF f D( of +     )0 64 1 A(Chapter 3, "Parsing")64 0 TN TL()Ec /AF f D( describes excep)HY(tions)YH( +     and error handling mech)HY(a)HY(nisms)YH( specific to the parsing func)HY(tions)YH(. +     )0 85 1 A(Section 4.4, "Error Handling")85 0 TN TL()Ec /AF f D( of +     )0 81 1 A(Chapter 4, "Seri)HY(al)HY(iza)HY(tion)YH(")81 0 TN TL()Ec /AF f D( describes excep)HY(tions)YH( +     and error handling mech)HY(a)HY(nisms)YH( specific to the seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH(. +  )EP( + + +  )0 3 12 H(2.2.1)WB 109 Sn()WB 15 Sn( )SM(xml_schema::dupli)HY(cate)YH(_id)ES()EA()EH( + +  ) 10 48 PR(struct duplicate_id: virtual exception +{ +  duplicate_id \201const std::basic_string<C>& id\202; + +  const std::basic_string<C>& +  id \201\202 const; + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::dupli)HY(cate)YH(_id)ES( is thrown when +     a conflict)HY(ing)YH( instance of )SM(xml_schema::id)ES( \201see +     )0 21 1 A(Section 2.5, "Mapping for Built-in Data Types")21 0 TN TL()Ec /AF f D(\202 +     is added to a tree. The offend)HY(ing)YH( ID value can be obtained using +     the )SM(id)ES( func)HY(tion)YH(. +  )EP( + +  )0 2 13 H(2.3)WB 110 Sn()WB 16 Sn( Mapping for )SM(import)ES( and )SM(include)ES()EA()EH( + +  )0 3 14 H(2.3.1)WB 111 Sn()WB 17 Sn( Import)EA()EH( + +  )0 P(The XML Schema )SM(import)ES( element is mapped to the C++ +     Prepro)HY(ces)HY(sor)YH( )SM(#include)ES( direc)HY(tive)YH(. The value of +     the )SM(schemaLo)HY(ca)HY(tion)YH()ES( attribute is used to derive +     the name of the header file that appears in the )SM(#include)ES( +     direc)HY(tive)YH(. For instance: +  )EP( + +  ) 2 53 PR(<import namespace="http://www.codesynthesis.com/test" +        schemaLocation="test.xsd"/>)RP( + +  )0 P(is mapped to:)EP( + +  ) 1 19 PR(#include "test.hxx")RP( + +  )0 P(Note that you will need to compile imported schemas sepa)HY(rately)YH( +     in order to produce corre)HY(spond)HY(ing)YH( header files.)EP( + +  )0 3 15 H(2.3.2)WB 112 Sn()WB 18 Sn( Inclu)HY(sion)YH( with Target Names)HY(pace)YH()EA()EH( + +  )0 P(The XML Schema )SM(include)ES( element which refers to a schema +     with a target names)HY(pace)YH( or appears in a schema without a target names)HY(pace)YH( +     follows the same mapping rules as the )SM(import)ES( element, +     see )0 17 1 A(Section 2.3.1, "Import")17 0 TN TL()Ec /AF f D(. +  )EP( + +  )0 3 16 H(2.3.3)WB 113 Sn()WB 19 Sn( Inclu)HY(sion)YH( without Target Names)HY(pace)YH()EA()EH( + +  )0 P(For the XML Schema )SM(include)ES( element which refers to a schema +     without a target names)HY(pace)YH( and appears in a schema with a target +     names)HY(pace)YH( \201such inclu)HY(sion)YH( some)HY(times)YH( called "chameleon inclu)HY(sion)YH("\202, +     decla)HY(ra)HY(tions)YH( and defi)HY(ni)HY(tions)YH( from the included schema are gener)HY(ated)YH( +     in-line in the names)HY(pace)YH( of the includ)HY(ing)YH( schema as if they were +     declared and defined there verba)HY(tim)YH(. For example, consider the +     follow)HY(ing)YH( two schemas: +  )EP( + +  ) 11 60 PR(<-- common.xsd --> +<schema> +  <complexType name="type"> +  ... +  </complexType> +</schema> + +<-- test.xsd --> +<schema targetNamespace="http://www.codesynthesis.com/test"> +  <include schemaLocation="common.xsd"/> +</schema>)RP( + +  )0 P(The frag)HY(ment)YH( of inter)HY(est)YH( from the gener)HY(ated)YH( header file for +     )SM(text.xsd)ES( would look like this:)EP( + +  ) 8 14 PR(// test.hxx +namespace test +{ +  class type +  { +    ... +  }; +})RP( + +  )0 2 17 H(2.4)WB 114 Sn()WB 20 Sn( Mapping for Names)HY(paces)YH()EA()EH( + +  )0 P(An XML Schema names)HY(pace)YH( is mapped to one or more nested C++ +     names)HY(paces)YH(. XML Schema names)HY(paces)YH( are iden)HY(ti)HY(fied)YH( by URIs. +     By default, a names)HY(pace)YH( URI is mapped to a sequence of +     C++ names)HY(pace)YH( names by remov)HY(ing)YH( the proto)HY(col)YH( and host parts +     and split)HY(ting)YH( the rest into a sequence of names with ')SM(/)ES(' +     as the name sepa)HY(ra)HY(tor)YH(. For instance: +  )EP( + +  ) 3 67 PR(<schema targetNamespace="http://www.codesynthesis.com/system/test"> +  ... +</schema>)RP( + +  )0 P(is mapped to:)EP( + +  ) 7 16 PR(namespace system +{ +  namespace test +  { +    ... +  } +})RP( + +  )0 P(The default mapping of names)HY(pace)YH( URIs to C++ names)HY(pace)YH( names can be +     altered using the )SM(--names)HY(pace)YH(-map)ES( and +     )SM(--names)HY(pace)YH(-regex)ES( options. See  the +     )R8 2 A(XSD +     Compiler Command Line Manual)EA( for more infor)HY(ma)HY(tion)YH(. +  )EP( + +  )0 2 18 H(2.5)WB 115 Sn()WB 21 Sn( Mapping for Built-in Data Types)EA()EH( + +  )0 P(The mapping of XML Schema built-in data types to C++ types is +     summa)HY(rized)YH( in the table below.)EP( + +   +  )0 PT( + +  )0 P(All XML Schema built-in types are mapped to C++ classes that are +     derived from the )SM(xml_schema::simple_type)ES( class except +     where the mapping is to a funda)HY(men)HY(tal)YH( C++ type.)EP( + +  )0 P(The )SM(sequence)ES( class template is defined in an +     imple)HY(men)HY(ta)HY(tion)YH(-specific names)HY(pace)YH(. It conforms to the +     sequence inter)HY(face)YH( as defined by the ISO/ANSI Stan)HY(dard)YH( for +     C++ \201ISO/IEC 14882:1998, Section 23.1.1, "Sequences"\202. +     Prac)HY(ti)HY(cally)YH(, this means that you can treat such a sequence +     as if it was )SM(std::vector)ES(. One notable exten)HY(sion)YH( +     to the stan)HY(dard)YH( inter)HY(face)YH( that is avail)HY(able)YH( only for +     sequences of non-funda)HY(men)HY(tal)YH( C++ types is the addi)HY(tion)YH( of +     the over)HY(loaded)YH( )SM(push_back)ES( and )SM(insert)ES( +     member func)HY(tions)YH( which instead of the constant refer)HY(ence)YH( +     to the element type accept auto)HY(matic)YH( pointer \201)SM(std::auto_ptr)ES( +     or )SM(std::unique_ptr)ES(, depend)HY(ing)YH( on the C++ stan)HY(dard)YH( +     selected\202 to the element type. These func)HY(tions)YH( assume owner)HY(ship)YH( +     of the pointed to object and reset the passed auto)HY(matic)YH( pointer. +  )EP( + +  )0 3 19 H(2.5.1)WB 116 Sn()WB 23 Sn( Inher)HY(i)HY(tance)YH( from Built-in Data Types)EA()EH( + +  )0 P(In cases where the mapping calls for an inher)HY(i)HY(tance)YH( from a built-in +     type which is mapped to a funda)HY(men)HY(tal)YH( C++ type, a proxy type is +     used instead of the funda)HY(men)HY(tal)YH( C++ type \201C++ does not allow +     inher)HY(i)HY(tance)YH( from funda)HY(men)HY(tal)YH( types\202. For instance:)EP( + +  ) 3 27 PR(<simpleType name="my_int"> +  <restriction base="int"/> +</simpleType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 4 42 PR(class my_int: public fundamental_base<int> +{ +  ... +};)RP( + +  )0 P(The )SM(funda)HY(men)HY(tal)YH(_base)ES( class template provides a close +     emula)HY(tion)YH( \201though not exact\202 of a funda)HY(men)HY(tal)YH( C++ type. +     It is defined in an imple)HY(men)HY(ta)HY(tion)YH(-specific names)HY(pace)YH( and has the +     follow)HY(ing)YH( inter)HY(face)YH(:)EP( + +  ) 22 44 PR(template <typename X> +class fundamental_base: public simple_type +{ +public: +  fundamental_base \201\202; +  fundamental_base \201X\202 +  fundamental_base \201const fundamental_base&\202 + +public: +  fundamental_base& +  operator= \201const X&\202; + +public: +  operator const X & \201\202 const; +  operator X& \201\202; + +  template <typename Y> +  operator Y \201\202 const; + +  template <typename Y> +  operator Y \201\202; +};)RP( + +  )0 3 20 H(2.5.2)WB 117 Sn()WB 24 Sn( Mapping for )SM(anyType)ES()EA()EH( + +  )0 P(The XML Schema )SM(anyType)ES( built-in data type is mapped to the +     )SM(xml_schema::type)ES( C++ class:)EP( + +  ) 53 48 PR(class type +{ +public: +  virtual +  ~type \201\202; + +  type \201\202; +  type \201const type&\202; + +  type& +  operator= \201const type&\202; + +  virtual type* +  _clone \201\202 const; + +  // anyType DOM content. +  // +public: +  typedef element_optional dom_content_optional; + +  const dom_content_optional& +  dom_content \201\202 const; + +  dom_content_optional& +  dom_content \201\202; + +  void +  dom_content \201const xercesc::DOMElement&\202; + +  void +  dom_content \201xercesc::DOMElement*\202;)WR( + +  void +  dom_content \201const dom_content_optional&\202; + +  const xercesc::DOMDocument& +  dom_content_document \201\202 const; + +  xercesc::DOMDocument& +  dom_content_document \201\202; + +  bool +  null_content \201\202 const; + +  // DOM association. +  // +public: +  const xercesc::DOMNode* +  _node \201\202 const; + +  xercesc::DOMNode* +  _node \201\202; +};)RP( + +  )0 P(When )SM(xml_schema::type)ES( is used to create an instance +     \201as opposed to being a base of a derived type\202, it repre)HY(sents)YH( +     the XML Schema )SM(anyType)ES( type. )SM(anyType)ES( +     allows any attributes and any content in any order. In the +     C++/Tree mapping this content can be repre)HY(sented)YH( as a DOM +     frag)HY(ment)YH(, similar to XML Schema wild)HY(cards)YH( \201)0 57 1 A(Section +     2.12, "Mapping for )SM(any)ES( and +     )SM(anyAt)HY(tribute)YH()ES(")57 0 TN TL()Ec /AF f D(\202.)EP( + +  )0 P(To enable auto)HY(matic)YH( extrac)HY(tion)YH( of )SM(anyType)ES( content +     during parsing, the )SM(--gener)HY(ate)YH(-any-type)ES( option must be +     spec)HY(i)HY(fied)YH(. Because the DOM API is used to access such content, the +     Xerces-C++ runtime should be initial)HY(ized)YH( by the appli)HY(ca)HY(tion)YH( prior to +     parsing and should remain initial)HY(ized)YH( for the life)HY(time)YH( of objects +     with the DOM content. For more infor)HY(ma)HY(tion)YH( on the Xerces-C++ runtime +     initial)HY(iza)HY(tion)YH( see )0 65 1 A(Section 3.1, "Initial)HY(iz)HY(ing)YH( the +     Xerces-C++ Runtime")65 0 TN TL()Ec /AF f D(.)EP( + +  )0 P(The DOM content is stored as the optional DOM element container +     and the DOM content acces)HY(sors)YH( and modi)HY(fiers)YH( presented above are +     iden)HY(ti)HY(cal)YH( to those gener)HY(ated)YH( for an optional element wild)HY(card)YH(. +     Refer to )0 59 1 A(Section 2.12.2, "Mapping for )SM(any)ES( +     with the Optional Cardi)HY(nal)HY(ity)YH( Class")59 0 TN TL()Ec /AF f D( for details on their +     seman)HY(tics)YH(.)EP( + +  )0 P(The )SM(dom_content_docu)HY(ment)YH(\201\202)ES( func)HY(tion)YH( returns the +     DOM docu)HY(ment)YH( used to store the raw XML content corre)HY(spond)HY(ing)YH( +     to the )SM(anyType)ES( instance. It is equiv)HY(a)HY(lent)YH( to the +     )SM(dom_docu)HY(ment)YH(\201\202)ES( func)HY(tion)YH( gener)HY(ated)YH( for types +     with wild)HY(cards)YH(.)EP( + +  )0 P(The )SM(null_content\201\202)ES( acces)HY(sor)YH( is an opti)HY(miza)HY(tion)YH( func)HY(tion)YH( +     that allows us to check for the lack of content without actu)HY(ally)YH( +     creat)HY(ing)YH( its empty repre)HY(sen)HY(ta)HY(tion)YH(, that is, empty DOM docu)HY(ment)YH( for +     )SM(anyType)ES( or empty string for )SM(anySim)HY(ple)HY(Type)YH()ES( +     \201see the follow)HY(ing)YH( section for details on )SM(anySim)HY(ple)HY(Type)YH()ES(\202.)EP( + +  )0 P(For more infor)HY(ma)HY(tion)YH( on DOM asso)HY(ci)HY(a)HY(tion)YH( refer to +     )0 93 1 A(Section 5.1, "DOM Asso)HY(ci)HY(a)HY(tion)YH(")93 0 TN TL()Ec /AF f D(.)EP( + +  )0 3 21 H(2.5.3)WB 118 Sn()WB 25 Sn( Mapping for )SM(anySim)HY(ple)HY(Type)YH()ES()EA()EH( + +  )0 P(The XML Schema )SM(anySim)HY(ple)HY(Type)YH()ES( built-in data type is mapped +     to the )SM(xml_schema::simple_type)ES( C++ class:)EP( + +  ) 27 45 PR(class simple_type: public type +{ +public: +  simple_type \201\202; +  simple_type \201const C*\202; +  simple_type \201const std::basic_string<C>&\202; + +  simple_type \201const simple_type&\202; + +  simple_type& +  operator= \201const simple_type&\202; + +  virtual simple_type* +  _clone \201\202 const; + +  // anySimpleType text content. +  // +public: +  const std::basic_string<C>& +  text_content \201\202 const; + +  std::basic_string<C>& +  text_content \201\202; + +  void +  text_content \201const std::basic_string<C>&\202; +};)RP( + +  )0 P(When )SM(xml_schema::simple_type)ES( is used to create an instance +     \201as opposed to being a base of a derived type\202, it repre)HY(sents)YH( +     the XML Schema )SM(anySim)HY(ple)HY(Type)YH()ES( type. )SM(anySim)HY(ple)HY(Type)YH()ES( +     allows any simple content. In the C++/Tree mapping this content can +     be repre)HY(sented)YH( as a string and accessed or modi)HY(fied)YH( with the +     )SM(text_content\201\202)ES( func)HY(tions)YH( shown above.)EP( + +  )0 3 22 H(2.5.4)WB 119 Sn()WB 26 Sn( Mapping for )SM(QName)ES()EA()EH( + +  )0 P(The XML Schema )SM(QName)ES( built-in data type is mapped to the +     )SM(xml_schema::qname)ES( C++ class:)EP( + +  ) 25 36 PR(class qname: public simple_type +{ +public: +  qname \201const ncname&\202; +  qname \201const uri&, const ncname&\202; +  qname \201const qname&\202; + +public: +  qname& +  operator= \201const qname&\202; + +public: +  virtual qname* +  _clone \201\202 const; + +public: +  bool +  qualified \201\202 const; + +  const uri& +  namespace_ \201\202 const; + +  const ncname& +  name \201\202 const; +};)RP( + +  )0 P(The )SM(qual)HY(i)HY(fied)YH()ES( acces)HY(sor)YH( func)HY(tion)YH( can be used to deter)HY(mine)YH( +     if the name is qual)HY(i)HY(fied)YH(.)EP( + +  )0 3 23 H(2.5.5)WB 120 Sn()WB 27 Sn( Mapping for )SM(IDREF)ES()EA()EH( + +  )0 P(The XML Schema )SM(IDREF)ES( built-in data type is mapped to the +     )SM(xml_schema::idref)ES( C++ class. This class imple)HY(ments)YH( the +     smart pointer C++ idiom:)EP( + +  ) 56 44 PR(class idref: public ncname +{ +public: +  idref \201const C* s\202; +  idref \201const C* s, std::size_t n\202; +  idref \201std::size_t n, C c\202; +  idref \201const std::basic_string<C>&\202; +  idref \201const std::basic_string<C>&, +         std::size_t pos, +         std::size_t n = npos\202; + +public: +  idref \201const idref&\202; + +public: +  virtual idref* +  _clone \201\202 const; + +public: +  idref& +  operator= \201C c\202; + +  idref& +  operator= \201const C* s\202; + +  idref& +  operator= \201const std::basic_string<C>&\202 + +  idref& +  operator= \201const idref&\202; +)WR( +public: +  const type* +  operator-> \201\202 const; + +  type* +  operator-> \201\202; + +  const type& +  operator* \201\202 const; + +  type& +  operator* \201\202; + +  const type* +  get \201\202 const; + +  type* +  get \201\202; + +  // Conversion to bool. +  // +public: +  typedef void \201idref::*bool_convertible\202\201\202; +  operator bool_convertible \201\202 const; +};)RP( + +  )0 P(The object, )SM(idref)ES( instance refers to, is the imme)HY(di)HY(ate)YH( +     container of the match)HY(ing)YH( )SM(id)ES( instance. For example, +     with the follow)HY(ing)YH( instance docu)HY(ment)YH( and schema: +  )EP( + + +  ) 22 49 PR(<!-- test.xml --> +<root> +  <object id="obj-1" text="hello"/> +  <reference>obj-1</reference> +</root> + +<!-- test.xsd --> +<schema> +  <complexType name="object_type"> +    <attribute name="id" type="ID"/> +    <attribute name="text" type="string"/> +  </complexType> + +  <complexType name="root_type"> +    <sequence> +      <element name="object" type="object_type"/> +      <element name="reference" type="IDREF"/> +    </sequence> +  </complexType> + +  <element name="root" type="root_type"/> +</schema>)RP( + +  )0 P(The )SM(ref)ES( instance in the code below will refer to +     an object of type )SM(object_type)ES(:)EP( + +  ) 4 53 PR(root_type& root = ...; +xml_schema::idref& ref \201root.reference \201\202\202; +object_type& obj \201dynamic_cast<object_type&> \201*ref\202\202; +cout << obj.text \201\202 << endl;)RP( + +  )0 P(The smart pointer inter)HY(face)YH( of the )SM(idref)ES( class always +     returns a pointer or refer)HY(ence)YH( to )SM(xml_schema::type)ES(. +     This means that you will need to manu)HY(ally)YH( cast such pointer or +     refer)HY(ence)YH( to its real \201dynamic\202 type before you can use it \201unless +     all you need is the base inter)HY(face)YH( provided by +     )SM(xml_schema::type)ES(\202. As a special exten)HY(sion)YH( to the XML +     Schema language, the mapping supports static typing of )SM(idref)ES( +     refer)HY(ences)YH( by employ)HY(ing)YH( the )SM(refType)ES( exten)HY(sion)YH( attribute. +     The follow)HY(ing)YH( example illus)HY(trates)YH( this mech)HY(a)HY(nism)YH(: +  )EP( + +  ) 11 72 PR(<!-- test.xsd --> +<schema +  xmlns:xse="http://www.codesynthesis.com/xmlns/xml-schema-extension"> + +  ... + +      <element name="reference" type="IDREF" xse:refType="object_type"/> + +  ... + +</schema>)RP( + +  )0 P(With this modi)HY(fi)HY(ca)HY(tion)YH( we do not need to do manual casting anymore: +  )EP( + +  ) 4 51 PR(root_type& root = ...; +root_type::reference_type& ref \201root.reference \201\202\202; +object_type& obj \201*ref\202; +cout << ref->text \201\202 << endl;)RP( + + +  )0 3 24 H(2.5.6)WB 121 Sn()WB 28 Sn( Mapping for )SM(base64Binary)ES( and +      )SM(hexBi)HY(nary)YH()ES()EA()EH( + +  )0 P(The XML Schema )SM(base64Binary)ES( and )SM(hexBi)HY(nary)YH()ES( +     built-in data types are mapped to the +     )SM(xml_schema::base64_binary)ES( and +     )SM(xml_schema::hex_binary)ES( C++ classes, respec)HY(tively)YH(. The +     )SM(base64_binary)ES( and )SM(hex_binary)ES( classes +     support a simple buffer abstrac)HY(tion)YH( by inher)HY(it)HY(ing)YH( from the +     )SM(xml_schema::buffer)ES( class: +  )EP( + +  ) 64 58 PR(class bounds: public virtual exception +{ +public: +  virtual const char* +  what \201\202 const throw \201\202; +}; + +class buffer +{ +public: +  typedef std::size_t size_t; + +public: +  buffer \201size_t size = 0\202; +  buffer \201size_t size, size_t capacity\202; +  buffer \201const void* data, size_t size\202; +  buffer \201const void* data, size_t size, size_t capacity\202; +  buffer \201void* data, +          size_t size, +          size_t capacity, +          bool assume_ownership\202; + +public: +  buffer \201const buffer&\202; + +  buffer& +  operator= \201const buffer&\202; + +  void +  swap \201buffer&\202; +)WR( +public: +  size_t +  capacity \201\202 const; + +  bool +  capacity \201size_t\202; + +public: +  size_t +  size \201\202 const; + +  bool +  size \201size_t\202; + +public: +  const char* +  data \201\202 const; + +  char* +  data \201\202; + +  const char* +  begin \201\202 const; + +  char* +  begin \201\202; + +  const char* +  end \201\202 const; +)WR( +  char* +  end \201\202; +};)RP( + +  )0 P(The last over)HY(loaded)YH( construc)HY(tor)YH( reuses an exist)HY(ing)YH( data buffer instead +     of making a copy. If the )SM(assume_owner)HY(ship)YH()ES( argu)HY(ment)YH( is +     )SM(true)ES(, the instance assumes owner)HY(ship)YH( of the +     memory block pointed to by the )SM(data)ES( argu)HY(ment)YH( and will +     even)HY(tu)HY(ally)YH( release it by calling )SM(oper)HY(a)HY(tor)YH( delete)ES(. The +     )SM(capac)HY(ity)YH()ES( and )SM(size)ES( modi)HY(fier)YH( func)HY(tions)YH( return +     )SM(true)ES( if the under)HY(ly)HY(ing)YH( buffer has moved. +  )EP( + +  )0 P(The )SM(bounds)ES( excep)HY(tion)YH( is thrown if the construc)HY(tor)YH( +     argu)HY(ments)YH( violate the )SM(\201size\240<=\240capac)HY(ity)YH(\202)ES( +     constraint.)EP( + +  )0 P(The )SM(base64_binary)ES( and )SM(hex_binary)ES( classes +     support the )SM(buffer)ES( inter)HY(face)YH( and perform auto)HY(matic)YH( +     decod)HY(ing)YH(/encod)HY(ing)YH( from/to the Base64 and Hex formats, respec)HY(tively)YH(: +  )EP( + +  ) 25 65 PR(class base64_binary: public simple_type, public buffer +{ +public: +  base64_binary \201size_t size = 0\202; +  base64_binary \201size_t size, size_t capacity\202; +  base64_binary \201const void* data, size_t size\202; +  base64_binary \201const void* data, size_t size, size_t capacity\202; +  base64_binary \201void* data, +                 size_t size, +                 size_t capacity, +                 bool assume_ownership\202; + +public: +  base64_binary \201const base64_binary&\202; + +  base64_binary& +  operator= \201const base64_binary&\202; + +  virtual base64_binary* +  _clone \201\202 const; + +public: +  std::basic_string<C> +  encode \201\202 const; +};)RP( + +  ) 25 62 PR(class hex_binary: public simple_type, public buffer +{ +public: +  hex_binary \201size_t size = 0\202; +  hex_binary \201size_t size, size_t capacity\202; +  hex_binary \201const void* data, size_t size\202; +  hex_binary \201const void* data, size_t size, size_t capacity\202; +  hex_binary \201void* data, +              size_t size, +              size_t capacity, +              bool assume_ownership\202; + +public: +  hex_binary \201const hex_binary&\202; + +  hex_binary& +  operator= \201const hex_binary&\202; + +  virtual hex_binary* +  _clone \201\202 const; + +public: +  std::basic_string<C> +  encode \201\202 const; +};)RP( + + +  )0 2 25 H(2.5.7)WB 122 Sn()WB 29 Sn( Time Zone Repre)HY(sen)HY(ta)HY(tion)YH()EA()EH( + +  )0 P(The )SM(date)ES(, )SM(date)HY(Time)YH()ES(, )SM(gDay)ES(, +     )SM(gMonth)ES(, )SM(gMon)HY(th)HY(Day)YH()ES(, )SM(gYear)ES(, +     )SM(gYear)HY(Month)YH()ES(, and )SM(time)ES( XML Schema built-in +     types all include an optional time zone compo)HY(nent)YH(. The follow)HY(ing)YH( +     )SM(xml_schema::time_zone)ES( base class is used to repre)HY(sent)YH( +     this infor)HY(ma)HY(tion)YH(:)EP( + +  ) 30 48 PR(class time_zone +{ +public: +  time_zone \201\202; +  time_zone \201short hours, short minutes\202; + +  bool +  zone_present \201\202 const; + +  void +  zone_reset \201\202; + +  short +  zone_hours \201\202 const; + +  void +  zone_hours \201short\202; + +  short +  zone_minutes \201\202 const; + +  void +  zone_minutes \201short\202; +}; + +bool +operator== \201const time_zone&, const time_zone&\202; + +bool +operator!= \201const time_zone&, const time_zone&\202;)RP( + +  )0 P(The )SM(zone_present\201\202)ES( acces)HY(sor)YH( func)HY(tion)YH( returns )SM(true)ES( +     if the time zone is spec)HY(i)HY(fied)YH(. The )SM(zone_reset\201\202)ES( modi)HY(fier)YH( +     func)HY(tion)YH( resets the time zone object to the )EM(not spec)HY(i)HY(fied)YH()ES( +     state. If the time zone offset is nega)HY(tive)YH( then both hours and +     minutes compo)HY(nents)YH( are repre)HY(sented)YH( as nega)HY(tive)YH( inte)HY(gers)YH(.)EP( + + +  )0 2 26 H(2.5.8)WB 123 Sn()WB 30 Sn( Mapping for )SM(date)ES()EA()EH( + + )0 P(The XML Schema )SM(date)ES( built-in data type is mapped to the +    )SM(xml_schema::date)ES( C++ class which repre)HY(sents)YH( a year, a day, +    and a month with an optional time zone. Its inter)HY(face)YH( is presented +    below. For more infor)HY(ma)HY(tion)YH( on the base )SM(xml_schema::time_zone)ES( +    class refer to )0 29 1 A(Section 2.5.7, "Time Zone +    Repre)HY(sen)HY(ta)HY(tion)YH(")29 0 TN TL()Ec /AF f D(.)EP( + +  ) 41 60 PR(class date: public simple_type, public time_zone +{ +public: +  date \201int year, unsigned short month, unsigned short day\202; +  date \201int year, unsigned short month, unsigned short day, +        short zone_hours, short zone_minutes\202; + +public: +  date \201const date&\202; + +  date& +  operator= \201const date&\202; + +  virtual date* +  _clone \201\202 const; + +public: +  int +  year \201\202 const; + +  void +  year \201int\202; + +  unsigned short +  month \201\202 const; + +  void +  month \201unsigned short\202; + +  unsigned short +  day \201\202 const;)WR( + +  void +  day \201unsigned short\202; +}; + +bool +operator== \201const date&, const date&\202; + +bool +operator!= \201const date&, const date&\202;)RP( + +  )0 2 27 H(2.5.9)WB 124 Sn()WB 31 Sn( Mapping for )SM(date)HY(Time)YH()ES()EA()EH( + + )0 P(The XML Schema )SM(date)HY(Time)YH()ES( built-in data type is mapped to the +    )SM(xml_schema::date_time)ES( C++ class which repre)HY(sents)YH( a year, a month, +    a day, hours, minutes, and seconds with an optional time zone. Its inter)HY(face)YH( +    is presented below. For more infor)HY(ma)HY(tion)YH( on the base +    )SM(xml_schema::time_zone)ES( class refer to )0 29 1 A(Section +    2.5.7, "Time Zone Repre)HY(sen)HY(ta)HY(tion)YH(")29 0 TN TL()Ec /AF f D(.)EP( + +  ) 62 67 PR(class date_time: public simple_type, public time_zone +{ +public: +  date_time \201int year, unsigned short month, unsigned short day, +             unsigned short hours, unsigned short minutes, +             double seconds\202; + +  date_time \201int year, unsigned short month, unsigned short day, +             unsigned short hours, unsigned short minutes, +             double seconds, short zone_hours, short zone_minutes\202; +public: +  date_time \201const date_time&\202; + +  date_time& +  operator= \201const date_time&\202; + +  virtual date_time* +  _clone \201\202 const; + +public: +  int +  year \201\202 const; + +  void +  year \201int\202; + +  unsigned short +  month \201\202 const; + +  void +  month \201unsigned short\202;)WR( + +  unsigned short +  day \201\202 const; + +  void +  day \201unsigned short\202; + +  unsigned short +  hours \201\202 const; + +  void +  hours \201unsigned short\202; + +  unsigned short +  minutes \201\202 const; + +  void +  minutes \201unsigned short\202; + +  double +  seconds \201\202 const; + +  void +  seconds \201double\202; +}; + +bool +operator== \201const date_time&, const date_time&\202; + +bool)WR( +operator!= \201const date_time&, const date_time&\202;)RP( + + +  )0 2 28 H(2.5.10)WB 125 Sn()WB 32 Sn( Mapping for )SM(dura)HY(tion)YH()ES()EA()EH( + +  )0 P(The XML Schema )SM(dura)HY(tion)YH()ES( built-in data type is mapped to the +    )SM(xml_schema::dura)HY(tion)YH()ES( C++ class which repre)HY(sents)YH( a poten)HY(tially)YH( +     nega)HY(tive)YH( dura)HY(tion)YH( in the form of years, months, days, hours, minutes, +     and seconds. Its inter)HY(face)YH( is presented below.)EP( + +  ) 64 71 PR(class duration: public simple_type +{ +public: +  duration \201bool negative, +            unsigned int years, unsigned int months, unsigned int days, +            unsigned int hours, unsigned int minutes, double seconds\202; +public: +  duration \201const duration&\202; + +  duration& +  operator= \201const duration&\202; + +  virtual duration* +  _clone \201\202 const; + +public: +  bool +  negative \201\202 const; + +  void +  negative \201bool\202; + +  unsigned int +  years \201\202 const; + +  void +  years \201unsigned int\202; + +  unsigned int +  months \201\202 const; +)WR( +  void +  months \201unsigned int\202; + +  unsigned int +  days \201\202 const; + +  void +  days \201unsigned int\202; + +  unsigned int +  hours \201\202 const; + +  void +  hours \201unsigned int\202; + +  unsigned int +  minutes \201\202 const; + +  void +  minutes \201unsigned int\202; + +  double +  seconds \201\202 const; + +  void +  seconds \201double\202; +}; + +bool +operator== \201const duration&, const duration&\202;)WR( + +bool +operator!= \201const duration&, const duration&\202;)RP( + + +  )0 2 29 H(2.5.11)WB 126 Sn()WB 33 Sn( Mapping for )SM(gDay)ES()EA()EH( + +  )0 P(The XML Schema )SM(gDay)ES( built-in data type is mapped to the +    )SM(xml_schema::gday)ES( C++ class which repre)HY(sents)YH( a day of the +     month with an optional time zone. Its inter)HY(face)YH( is presented below. +     For more infor)HY(ma)HY(tion)YH( on the base )SM(xml_schema::time_zone)ES( +     class refer to )0 29 1 A(Section 2.5.7, "Time Zone +     Repre)HY(sen)HY(ta)HY(tion)YH(")29 0 TN TL()Ec /AF f D(.)EP( + +  ) 29 66 PR(class gday: public simple_type, public time_zone +{ +public: +  explicit +  gday \201unsigned short day\202; +  gday \201unsigned short day, short zone_hours, short zone_minutes\202; + +public: +  gday \201const gday&\202; + +  gday& +  operator= \201const gday&\202; + +  virtual gday* +  _clone \201\202 const; + +public: +  unsigned short +  day \201\202 const; + +  void +  day \201unsigned short\202; +}; + +bool +operator== \201const gday&, const gday&\202; + +bool +operator!= \201const gday&, const gday&\202;)RP( + + +  )0 2 30 H(2.5.12)WB 127 Sn()WB 34 Sn( Mapping for )SM(gMonth)ES()EA()EH( + +  )0 P(The XML Schema )SM(gMonth)ES( built-in data type is mapped to the +    )SM(xml_schema::gmonth)ES( C++ class which repre)HY(sents)YH( a month of the +     year with an optional time zone. Its inter)HY(face)YH( is presented below. +     For more infor)HY(ma)HY(tion)YH( on the base )SM(xml_schema::time_zone)ES( +     class refer to )0 29 1 A(Section 2.5.7, "Time Zone +     Repre)HY(sen)HY(ta)HY(tion)YH(")29 0 TN TL()Ec /AF f D(.)EP( + +  ) 30 50 PR(class gmonth: public simple_type, public time_zone +{ +public: +  explicit +  gmonth \201unsigned short month\202; +  gmonth \201unsigned short month, +          short zone_hours, short zone_minutes\202; + +public: +  gmonth \201const gmonth&\202; + +  gmonth& +  operator= \201const gmonth&\202; + +  virtual gmonth* +  _clone \201\202 const; + +public: +  unsigned short +  month \201\202 const; + +  void +  month \201unsigned short\202; +}; + +bool +operator== \201const gmonth&, const gmonth&\202; + +bool +operator!= \201const gmonth&, const gmonth&\202;)RP( + + +  )0 2 31 H(2.5.13)WB 128 Sn()WB 35 Sn( Mapping for )SM(gMon)HY(th)HY(Day)YH()ES()EA()EH( + +  )0 P(The XML Schema )SM(gMon)HY(th)HY(Day)YH()ES( built-in data type is mapped to the +    )SM(xml_schema::gmonth_day)ES( C++ class which repre)HY(sents)YH( a day and +     a month of the year with an optional time zone. Its inter)HY(face)YH( is presented +     below. For more infor)HY(ma)HY(tion)YH( on the base )SM(xml_schema::time_zone)ES( +     class refer to )0 29 1 A(Section 2.5.7, "Time Zone +     Repre)HY(sen)HY(ta)HY(tion)YH(")29 0 TN TL()Ec /AF f D(.)EP( + +  ) 35 56 PR(class gmonth_day: public simple_type, public time_zone +{ +public: +  gmonth_day \201unsigned short month, unsigned short day\202; +  gmonth_day \201unsigned short month, unsigned short day, +              short zone_hours, short zone_minutes\202; + +public: +  gmonth_day \201const gmonth_day&\202; + +  gmonth_day& +  operator= \201const gmonth_day&\202; + +  virtual gmonth_day* +  _clone \201\202 const; + +public: +  unsigned short +  month \201\202 const; + +  void +  month \201unsigned short\202; + +  unsigned short +  day \201\202 const; + +  void +  day \201unsigned short\202; +}; + +bool)WR( +operator== \201const gmonth_day&, const gmonth_day&\202; + +bool +operator!= \201const gmonth_day&, const gmonth_day&\202;)RP( + + +  )0 2 32 H(2.5.14)WB 129 Sn()WB 36 Sn( Mapping for )SM(gYear)ES()EA()EH( + +  )0 P(The XML Schema )SM(gYear)ES( built-in data type is mapped to the +    )SM(xml_schema::gyear)ES( C++ class which repre)HY(sents)YH( a year with +     an optional time zone. Its inter)HY(face)YH( is presented below. For more +     infor)HY(ma)HY(tion)YH( on the base )SM(xml_schema::time_zone)ES( class refer +     to )0 29 1 A(Section 2.5.7, "Time Zone Repre)HY(sen)HY(ta)HY(tion)YH(")29 0 TN TL()Ec /AF f D(.)EP( + +  ) 29 57 PR(class gyear: public simple_type, public time_zone +{ +public: +  explicit +  gyear \201int year\202; +  gyear \201int year, short zone_hours, short zone_minutes\202; + +public: +  gyear \201const gyear&\202; + +  gyear& +  operator= \201const gyear&\202; + +  virtual gyear* +  _clone \201\202 const; + +public: +  int +  year \201\202 const; + +  void +  year \201int\202; +}; + +bool +operator== \201const gyear&, const gyear&\202; + +bool +operator!= \201const gyear&, const gyear&\202;)RP( + + +  )0 2 33 H(2.5.15)WB 130 Sn()WB 37 Sn( Mapping for )SM(gYear)HY(Month)YH()ES()EA()EH( + +  )0 P(The XML Schema )SM(gYear)HY(Month)YH()ES( built-in data type is mapped to +     the )SM(xml_schema::gyear_month)ES( C++ class which repre)HY(sents)YH( +     a year and a month with an optional time zone. Its inter)HY(face)YH( is presented +     below. For more infor)HY(ma)HY(tion)YH( on the base )SM(xml_schema::time_zone)ES( +     class refer to )0 29 1 A(Section 2.5.7, "Time Zone +     Repre)HY(sen)HY(ta)HY(tion)YH(")29 0 TN TL()Ec /AF f D(.)EP( + +  ) 34 55 PR(class gyear_month: public simple_type, public time_zone +{ +public: +  gyear_month \201int year, unsigned short month\202; +  gyear_month \201int year, unsigned short month, +               short zone_hours, short zone_minutes\202; +public: +  gyear_month \201const gyear_month&\202; + +  gyear_month& +  operator= \201const gyear_month&\202; + +  virtual gyear_month* +  _clone \201\202 const; + +public: +  int +  year \201\202 const; + +  void +  year \201int\202; + +  unsigned short +  month \201\202 const; + +  void +  month \201unsigned short\202; +}; + +bool +operator== \201const gyear_month&, const gyear_month&\202;)WR( + +bool +operator!= \201const gyear_month&, const gyear_month&\202;)RP( + + +  )0 2 34 H(2.5.16)WB 131 Sn()WB 38 Sn( Mapping for )SM(time)ES()EA()EH( + +  )0 P(The XML Schema )SM(time)ES( built-in data type is mapped to +     the )SM(xml_schema::time)ES( C++ class which repre)HY(sents)YH( hours, +     minutes, and seconds with an optional time zone. Its inter)HY(face)YH( is +     presented below. For more infor)HY(ma)HY(tion)YH( on the base +     )SM(xml_schema::time_zone)ES( class refer to +     )0 29 1 A(Section 2.5.7, "Time Zone Repre)HY(sen)HY(ta)HY(tion)YH(")29 0 TN TL()Ec /AF f D(.)EP( + +  ) 41 70 PR(class time: public simple_type, public time_zone +{ +public: +  time \201unsigned short hours, unsigned short minutes, double seconds\202; +  time \201unsigned short hours, unsigned short minutes, double seconds, +        short zone_hours, short zone_minutes\202; + +public: +  time \201const time&\202; + +  time& +  operator= \201const time&\202; + +  virtual time* +  _clone \201\202 const; + +public: +  unsigned short +  hours \201\202 const; + +  void +  hours \201unsigned short\202; + +  unsigned short +  minutes \201\202 const; + +  void +  minutes \201unsigned short\202; + +  double +  seconds \201\202 const;)WR( + +  void +  seconds \201double\202; +}; + +bool +operator== \201const time&, const time&\202; + +bool +operator!= \201const time&, const time&\202;)RP( + + +   + +  )0 2 35 H(2.6)WB 132 Sn()WB 39 Sn( Mapping for Simple Types)EA()EH( + +  )0 P(An XML Schema simple type is mapped to a C++ class with the same +     name as the simple type. The class defines a public copy construc)HY(tor)YH(, +     a public copy assign)HY(ment)YH( oper)HY(a)HY(tor)YH(, and a public virtual +     )SM(_clone)ES( func)HY(tion)YH(. The )SM(_clone)ES( func)HY(tion)YH( is +     declared )SM(const)ES(, does not take any argu)HY(ments)YH(, and returns +     a pointer to a complete copy of the instance allo)HY(cated)YH( in the free +     store. The )SM(_clone)ES( func)HY(tion)YH( shall be used to make copies +     when static type and dynamic type of the instance may differ \201see +     )0 56 1 A(Section 2.11, "Mapping for )SM(xsi:type)ES( +     and Substi)HY(tu)HY(tion)YH( Groups")56 0 TN TL()Ec /AF f D(\202. For instance:)EP( + +  ) 3 26 PR(<simpleType name="object"> +  ... +</simpleType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 16 28 PR(class object: ... +{ +public: +  object \201const object&\202; + +public: +  object& +  operator= \201const object&\202; + +public: +  virtual object* +  _clone \201\202 const; + +  ... + +};)RP( + +  )0 P(The base class spec)HY(i)HY(fi)HY(ca)HY(tion)YH( and the rest of the class defi)HY(ni)HY(tion)YH( +     depend on the type of deriva)HY(tion)YH( used to define the simple type. )EP( + + +  )0 3 36 H(2.6.1)WB 133 Sn()WB 40 Sn( Mapping for Deriva)HY(tion)YH( by Restric)HY(tion)YH()EA()EH( + +  )0 P(XML Schema deriva)HY(tion)YH( by restric)HY(tion)YH( is mapped to C++ public +     inher)HY(i)HY(tance)YH(. The base type of the restric)HY(tion)YH( becomes the base +     type for the result)HY(ing)YH( C++ class. In addi)HY(tion)YH( to the members described +     in )0 39 1 A(Section 2.6, "Mapping for Simple Types")39 0 TN TL()Ec /AF f D(, the +     result)HY(ing)YH( C++ class defines a public construc)HY(tor)YH( with the base type +     as its single argu)HY(ment)YH(. For instance:)EP( + +  ) 5 27 PR(<simpleType name="object"> +  <restriction base="base"> +    ... +  </restriction> +</simpleType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 14 28 PR(class object: public base +{ +public: +  object \201const base&\202; +  object \201const object&\202; + +public: +  object& +  operator= \201const object&\202; + +public: +  virtual object* +  _clone \201\202 const; +};)RP( + + +  )0 3 37 H(2.6.2)WB 134 Sn()WB 41 Sn( Mapping for Enumer)HY(a)HY(tions)YH()EA()EH( + +)0 P(XML Schema restric)HY(tion)YH( by enumer)HY(a)HY(tion)YH( is mapped to a C++ class +   with seman)HY(tics)YH( similar to C++ )SM(enum)ES(. Each XML Schema +   enumer)HY(a)HY(tion)YH( element is mapped to a C++ enumer)HY(a)HY(tor)YH( with the +   name derived from the )SM(value)ES( attribute and defined +   in the class scope. In addi)HY(tion)YH( to the members +   described in )0 39 1 A(Section 2.6, "Mapping for Simple Types")39 0 TN TL()Ec /AF f D(, +   the result)HY(ing)YH( C++ class defines a public construc)HY(tor)YH( that can be called +   with one of the enumer)HY(a)HY(tors)YH( as its single argu)HY(ment)YH(, a public construc)HY(tor)YH( +   that can be called with enumer)HY(a)HY(tion)YH('s base value as its single +   argu)HY(ment)YH(, a public assign)HY(ment)YH( oper)HY(a)HY(tor)YH( that can be used to assign the +   value of one of the enumer)HY(a)HY(tors)YH(, and a public implicit conver)HY(sion)YH( +   oper)HY(a)HY(tor)YH( to the under)HY(ly)HY(ing)YH( C++ enum type.)EP( + +)0 P(Further)HY(more)YH(, for string-based enumer)HY(a)HY(tion)YH( types, the result)HY(ing)YH( C++ +   class defines a public construc)HY(tor)YH( with a single argu)HY(ment)YH( of type +   )SM(const C*)ES( and a public construc)HY(tor)YH( with a single +   argu)HY(ment)YH( of type )SM(const std::basic_string<C>&)ES(. +   For instance:)EP( + +  ) 7 32 PR(<simpleType name="color"> +  <restriction base="string"> +    <enumeration value="red"/> +    <enumeration value="green"/> +    <enumeration value="blue"/> +  </restriction> +</simpleType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 31 38 PR(class color: public xml_schema::string +{ +public: +  enum value +  { +    red, +    green, +    blue +  }; + +public: +  color \201value\202; +  color \201const C*\202; +  color \201const std::basic_string<C>&\202; +  color \201const xml_schema::string&\202; +  color \201const color&\202; + +public: +  color& +  operator= \201value\202; + +  color& +  operator= \201const color&\202; + +public: +  virtual color* +  _clone \201\202 const; + +public: +  operator value \201\202 const; +};)WR()RP( + +  )0 3 38 H(2.6.3)WB 135 Sn()WB 42 Sn( Mapping for Deriva)HY(tion)YH( by List)EA()EH( + +  )0 P(XML Schema deriva)HY(tion)YH( by list is mapped to C++ public +     inher)HY(i)HY(tance)YH( from )SM(xml_schema::simple_type)ES( +     \201)0 25 1 A(Section 2.5.3, "Mapping for +     )SM(anySim)HY(ple)HY(Type)YH()ES(")25 0 TN TL()Ec /AF f D(\202 and a suit)HY(able)YH( sequence type. +     The list item type becomes the element type of the sequence. +     In addi)HY(tion)YH( to the members described in )0 39 1 A(Section 2.6, +     "Mapping for Simple Types")39 0 TN TL()Ec /AF f D(, the result)HY(ing)YH( C++ class defines +     a public default construc)HY(tor)YH(, a public construc)HY(tor)YH( +     with the first argu)HY(ment)YH( of type )SM(size_type)ES( and +     the second argu)HY(ment)YH( of list item type that creates +     a list object with the spec)HY(i)HY(fied)YH( number of copies of the spec)HY(i)HY(fied)YH( +     element value, and a public construc)HY(tor)YH( with the two argu)HY(ments)YH( +     of an input iter)HY(a)HY(tor)YH( type that creates a list object from an +     iter)HY(a)HY(tor)YH( range. For instance: +  )EP( + +  ) 3 28 PR(<simpleType name="int_list"> +  <list itemType="int"/> +</simpleType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 19 42 PR(class int_list: public simple_type, +                public sequence<int> +{ +public: +  int_list \201\202; +  int_list \201size_type n, int x\202; + +  template <typename I> +  int_list \201const I& begin, const I& end\202; +  int_list \201const int_list&\202; + +public: +  int_list& +  operator= \201const int_list&\202; + +public: +  virtual int_list* +  _clone \201\202 const; +};)RP( + +  )0 P(The )SM(sequence)ES( class template is defined in an +     imple)HY(men)HY(ta)HY(tion)YH(-specific names)HY(pace)YH(. It conforms to the +     sequence inter)HY(face)YH( as defined by the ISO/ANSI Stan)HY(dard)YH( for +     C++ \201ISO/IEC 14882:1998, Section 23.1.1, "Sequences"\202. +     Prac)HY(ti)HY(cally)YH(, this means that you can treat such a sequence +     as if it was )SM(std::vector)ES(. One notable exten)HY(sion)YH( +     to the stan)HY(dard)YH( inter)HY(face)YH( that is avail)HY(able)YH( only for +     sequences of non-funda)HY(men)HY(tal)YH( C++ types is the addi)HY(tion)YH( of +     the over)HY(loaded)YH( )SM(push_back)ES( and )SM(insert)ES( +     member func)HY(tions)YH( which instead of the constant refer)HY(ence)YH( +     to the element type accept auto)HY(matic)YH( pointer \201)SM(std::auto_ptr)ES( +     or )SM(std::unique_ptr)ES(, depend)HY(ing)YH( on the C++ stan)HY(dard)YH( +     selected\202 to the element type. These func)HY(tions)YH( assume owner)HY(ship)YH( +     of the pointed to object and reset the passed auto)HY(matic)YH( pointer. +  )EP( + +  )0 3 39 H(2.6.4)WB 136 Sn()WB 43 Sn( Mapping for Deriva)HY(tion)YH( by Union)EA()EH( + +  )0 P(XML Schema deriva)HY(tion)YH( by union is mapped to C++ public +     inher)HY(i)HY(tance)YH( from )SM(xml_schema::simple_type)ES( +     \201)0 25 1 A(Section 2.5.3, "Mapping for +     )SM(anySim)HY(ple)HY(Type)YH()ES(")25 0 TN TL()Ec /AF f D(\202 and )SM(std::basic_string<C>)ES(. +     In addi)HY(tion)YH( to the members described in )0 39 1 A(Section 2.6, +     "Mapping for Simple Types")39 0 TN TL()Ec /AF f D(, the result)HY(ing)YH( C++ class defines a +     public construc)HY(tor)YH( with a single argu)HY(ment)YH( of type )SM(const C*)ES( +     and a public construc)HY(tor)YH( with a single argu)HY(ment)YH( of type +     )SM(const std::basic_string<C>&)ES(. For instance: +  )EP( + +  ) 3 47 PR(<simpleType name="int_string_union"> +  <xsd:union memberTypes="xsd:int xsd:string"/> +</simpleType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 16 51 PR(class int_string_union: public simple_type, +                        public std::basic_string<C> +{ +public: +  int_string_union \201const C*\202; +  int_string_union \201const std::basic_string<C>&\202; +  int_string_union \201const int_string_union&\202; + +public: +  int_string_union& +  operator= \201const int_string_union&\202; + +public: +  virtual int_string_union* +  _clone \201\202 const; +};)RP( + +  )0 2 40 H(2.7)WB 137 Sn()WB 44 Sn( Mapping for Complex Types)EA()EH( + +  )0 P(An XML Schema complex type is mapped to a C++ class with the same +     name as the complex type. The class defines a public copy construc)HY(tor)YH(, +     a public copy assign)HY(ment)YH( oper)HY(a)HY(tor)YH(, and a public virtual +     )SM(_clone)ES( func)HY(tion)YH(. The )SM(_clone)ES( func)HY(tion)YH( is +     declared )SM(const)ES(, does not take any argu)HY(ments)YH(, and returns +     a pointer to a complete copy of the instance allo)HY(cated)YH( in the free +     store. The )SM(_clone)ES( func)HY(tion)YH( shall be used to make copies +     when static type and dynamic type of the instance may differ \201see +     )0 56 1 A(Section 2.11, "Mapping for )SM(xsi:type)ES( +     and Substi)HY(tu)HY(tion)YH( Groups")56 0 TN TL()Ec /AF f D(\202.)EP( + +  )0 P(Addi)HY(tion)HY(ally)YH(, the result)HY(ing)YH( C++ class +     defines two public construc)HY(tors)YH( that take an initial)HY(izer)YH( for each +     member of the complex type and all its base types that belongs to +     the One cardi)HY(nal)HY(ity)YH( class \201see )0 47 1 A(Section 2.8, "Mapping +     for Local Elements and Attributes")47 0 TN TL()Ec /AF f D(\202. In the first construc)HY(tor)YH(, +     the argu)HY(ments)YH( are passed as constant refer)HY(ences)YH( and the newly created +     instance is initial)HY(ized)YH( with copies of the passed objects. In the +     second construc)HY(tor)YH(, argu)HY(ments)YH( that are complex types \201that is, +     they them)HY(selves)YH( contain elements or attributes\202 are passed as +     either )SM(std::auto_ptr)ES( \201C++98\202 or )SM(std::unique_ptr)ES( +     \201C++11\202, depend)HY(ing)YH( on the C++ stan)HY(dard)YH( selected. In this case the newly +     created instance is directly initial)HY(ized)YH( with and assumes owner)HY(ship)YH( +     of the pointed to objects and the )SM(std::[auto|unique]_ptr)ES( +     argu)HY(ments)YH( are reset to )SM(0)ES(. For instance:)EP( + +  ) 15 66 PR(<complexType name="complex"> +  <sequence> +    <element name="a" type="int"/> +    <element name="b" type="string"/> +  </sequence> +</complexType> + +<complexType name="object"> +  <sequence> +    <element name="s-one" type="boolean"/> +    <element name="c-one" type="complex"/> +    <element name="optional" type="int" minOccurs="0"/> +    <element name="sequence" type="string" maxOccurs="unbounded"/> +  </sequence> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 36 68 PR(class complex: public xml_schema::type +{ +public: +  object \201const int& a, const xml_schema::string& b\202; +  object \201const complex&\202; + +public: +  object& +  operator= \201const complex&\202; + +public: +  virtual complex* +  _clone \201\202 const; + +  ... + +}; + +class object: public xml_schema::type +{ +public: +  object \201const bool& s_one, const complex& c_one\202; +  object \201const bool& s_one, std::[auto|unique]_ptr<complex> c_one\202; +  object \201const object&\202; + +public: +  object& +  operator= \201const object&\202; + +public: +  virtual object*)WR( +  _clone \201\202 const; + +  ... + +};)RP( + +  )0 P(Notice that the gener)HY(ated)YH( )SM(complex)ES( class does not +     have the second \201)SM(std::[auto|unique]_ptr)ES(\202 version of the +     construc)HY(tor)YH( since all its required members are of simple types.)EP( + +  )0 P(If an XML Schema complex type has an ulti)HY(mate)YH( base which is an XML +     Schema simple type then the result)HY(ing)YH( C++ class also defines a public +     construc)HY(tor)YH( that takes an initial)HY(izer)YH( for the base type as well as +     for each member of the complex type and all its base types that +     belongs to the One cardi)HY(nal)HY(ity)YH( class. For instance:)EP( + +  ) 7 61 PR(<complexType name="object"> +  <simpleContent> +    <extension base="date"> +      <attribute name="lang" type="language" use="required"/> +    </extension> +  </simpleContent> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 11 44 PR(class object: public xml_schema::string +{ +public: +  object \201const xml_schema::language& lang\202; + +  object \201const xml_schema::date& base, +          const xml_schema::language& lang\202; + +  ... + +};)RP( + +  )0 P(Further)HY(more)YH(, for string-based XML Schema complex types, the result)HY(ing)YH( C++ +     class also defines two  public construc)HY(tors)YH( with the first argu)HY(ments)YH( +     of type )SM(const C*)ES( and )SM(std::basic_string<C>&)ES(, +     respec)HY(tively)YH(, followed by argu)HY(ments)YH( for each member of the complex +     type and all its base types that belongs to the One cardi)HY(nal)HY(ity)YH( +     class. For enumer)HY(a)HY(tion)YH(-based complex types the result)HY(ing)YH( C++ +     class also defines a public construc)HY(tor)YH( with the first argu)HY(ments)YH( +     of the under)HY(ly)HY(ing)YH( enum type followed by argu)HY(ments)YH( for each member +     of the complex type and all its base types that belongs to the One +     cardi)HY(nal)HY(ity)YH( class. For instance:)EP( + +  ) 15 61 PR(<simpleType name="color"> +  <restriction base="string"> +    <enumeration value="red"/> +    <enumeration value="green"/> +    <enumeration value="blue"/> +  </restriction> +</simpleType> + +<complexType name="object"> +  <simpleContent> +    <extension base="color"> +      <attribute name="lang" type="language" use="required"/> +    </extension> +  </simpleContent> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 37 44 PR(class color: public xml_schema::string +{ +public: +  enum value +  { +    red, +    green, +    blue +  }; + +public: +  color \201value\202; +  color \201const C*\202; +  color \201const std::basic_string<C>&\202; + +  ... + +}; + +class object: color +{ +public: +  object \201const color& base, +          const xml_schema::language& lang\202; + +  object \201const color::value& base, +          const xml_schema::language& lang\202; + +  object \201const C* base, +          const xml_schema::language& lang\202; +)WR( +  object \201const std::basic_string<C>& base, +          const xml_schema::language& lang\202; + +  ... + +};)RP( + +  )0 P(Addi)HY(tional)YH( construc)HY(tors)YH( can be requested with the +     )SM(--gener)HY(ate)YH(-default-ctor)ES( and +     )SM(--gener)HY(ate)YH(-from-base-ctor)ES( options. See the +     )R8 2 A(XSD +     Compiler Command Line Manual)EA( for details.)EP( + +  )0 P(If an XML Schema complex type is not explic)HY(itly)YH( derived from any type, +     the result)HY(ing)YH( C++ class is derived from )SM(xml_schema::type)ES(. +     In cases where an XML Schema complex type is defined using deriva)HY(tion)YH( +     by exten)HY(sion)YH( or restric)HY(tion)YH(, the result)HY(ing)YH( C++ base class spec)HY(i)HY(fi)HY(ca)HY(tion)YH( +     depends on the type of deriva)HY(tion)YH( and is described in the subse)HY(quent)YH( +     sections. +  )EP( + +  )0 P(The mapping for elements and attributes that are defined in a complex +     type is described in )0 47 1 A(Section 2.8, "Mapping for Local +     Elements and Attributes")47 0 TN TL()Ec /AF f D(. +  )EP( + +  )0 3 41 H(2.7.1)WB 138 Sn()WB 45 Sn( Mapping for Deriva)HY(tion)YH( by Exten)HY(sion)YH()EA()EH( + +  )0 P(XML Schema deriva)HY(tion)YH( by exten)HY(sion)YH( is mapped to C++ public +     inher)HY(i)HY(tance)YH(. The base type of the exten)HY(sion)YH( becomes the base +     type for the result)HY(ing)YH( C++ class. +  )EP( + +  )0 3 42 H(2.7.2)WB 139 Sn()WB 46 Sn( Mapping for Deriva)HY(tion)YH( by Restric)HY(tion)YH()EA()EH( + +  )0 P(XML Schema deriva)HY(tion)YH( by restric)HY(tion)YH( is mapped to C++ public +     inher)HY(i)HY(tance)YH(. The base type of the restric)HY(tion)YH( becomes the base +     type for the result)HY(ing)YH( C++ class. XML Schema elements and +     attributes defined within restric)HY(tion)YH( do not result in any +     defi)HY(ni)HY(tions)YH( in the result)HY(ing)YH( C++ class. Instead, corre)HY(spond)HY(ing)YH( +     \201unre)HY(stricted)YH(\202 defi)HY(ni)HY(tions)YH( are inher)HY(ited)YH( from the base class. +     In the future versions of this mapping, such elements and +     attributes may result in redef)HY(i)HY(ni)HY(tions)YH( of acces)HY(sors)YH( and +     modi)HY(fiers)YH( to reflect their restricted seman)HY(tics)YH(. +  )EP( + +   + +  )0 2 43 H(2.8)WB 140 Sn()WB 47 Sn( Mapping for Local Elements and Attributes)EA()EH( + +   )0 P(XML Schema element and attribute defi)HY(ni)HY(tions)YH( are called local +      if they appear within a complex type defi)HY(ni)HY(tion)YH(, an element group +      defi)HY(ni)HY(tion)YH(, or an attribute group defi)HY(ni)HY(tions)YH(. +   )EP( + +   )0 P(Local XML Schema element and attribute defi)HY(ni)HY(tions)YH( have the same +      C++ mapping. There)HY(fore)YH(, in this section, local elements and +      attributes are collec)HY(tively)YH( called members. +   )EP( + +   )0 P(While there are many differ)HY(ent)YH( member cardi)HY(nal)HY(ity)YH( combi)HY(na)HY(tions)YH( +      \201deter)HY(mined)YH( by the )SM(use)ES( attribute for attributes and +       the )SM(minOc)HY(curs)YH()ES( and )SM(maxOc)HY(curs)YH()ES( attributes +       for elements\202, the mapping divides all possi)HY(ble)YH( cardi)HY(nal)HY(ity)YH( +       combi)HY(na)HY(tions)YH( into three cardi)HY(nal)HY(ity)YH( classes: +   )EP( + +   )0 DL(     )0 DT()I(one)ES( +     )DD(attributes: )SM(use == "required")ES( +     )DD(attributes: )SM(use == "optional")ES( and has default or fixed value +     )DD(elements: )SM(minOc)HY(curs)YH( == "1")ES( and )SM(maxOc)HY(curs)YH( == "1")ES( + +     )0 DT()I(optional)ES( +     )DD(attributes: )SM(use == "optional")ES( and doesn't have default or fixed value +     )DD(elements: )SM(minOc)HY(curs)YH( == "0")ES( and )SM(maxOc)HY(curs)YH( == "1")ES( + +     )0 DT()I(sequence)ES( +     )DD(elements: )SM(maxOc)HY(curs)YH( > "1")ES( +   )LD( + +   )0 P(An optional attribute with a default or fixed value acquires this value +      if the attribute hasn't been spec)HY(i)HY(fied)YH( in an instance docu)HY(ment)YH( \201see +      )0 95 1 A(Appendix A, "Default and Fixed Values")95 0 TN TL()Ec /AF f D(\202. This +      mapping places such optional attributes to the One cardi)HY(nal)HY(ity)YH( +      class.)EP( + +   )0 P(A member is mapped to a set of public type defi)HY(ni)HY(tions)YH( +      \201)SM(typedef)ES(s\202 and a set of public acces)HY(sor)YH( and modi)HY(fier)YH( +      func)HY(tions)YH(. Type defi)HY(ni)HY(tions)YH( have names derived from the member's +      name. The acces)HY(sor)YH( and modi)HY(fier)YH( func)HY(tions)YH( have the same name as the +      member. For example: +   )EP( + +  ) 5 42 PR(<complexType name="object"> +  <sequence> +    <element name="member" type="string"/> +  </sequence> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 11 41 PR(class object: public xml_schema::type +{ +public: +  typedef xml_schema::string member_type; + +  const member_type& +  member \201\202 const; + +  ... + +};)RP( + +   )0 P(In addi)HY(tion)YH(, if a member has a default or fixed value, a static +      acces)HY(sor)YH( func)HY(tion)YH( is gener)HY(ated)YH( that returns this value. For +      example:)EP( + +) 3 55 PR(<complexType name="object"> +  <attribute name="data" type="string" default="test"/> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 14 39 PR(class object: public xml_schema::type +{ +public: +  typedef xml_schema::string data_type; + +  const data_type& +  data \201\202 const; + +  static const data_type& +  data_default_value \201\202; + +  ... + +};)RP( + +   )0 P(Names and seman)HY(tics)YH( of type defi)HY(ni)HY(tions)YH( for the member as well +      as signa)HY(tures)YH( of the acces)HY(sor)YH( and modi)HY(fier)YH( func)HY(tions)YH( depend on +      the member's cardi)HY(nal)HY(ity)YH( class and are described in the follow)HY(ing)YH( +      sub-sections. +   )EP( + + +  )0 3 44 H(2.8.1)WB 141 Sn()WB 48 Sn( Mapping for Members with the One Cardi)HY(nal)HY(ity)YH( Class)EA()EH( + +   )0 P(For the One cardi)HY(nal)HY(ity)YH( class, the type defi)HY(ni)HY(tions)YH( consist of +      an alias for the member's type with the name created by append)HY(ing)YH( +      the )SM(_type)ES( suffix to the member's name. +   )EP( + +   )0 P(The acces)HY(sor)YH( func)HY(tions)YH( come in constant and non-constant versions. +      The constant acces)HY(sor)YH( func)HY(tion)YH( returns a constant refer)HY(ence)YH( to the +      member and can be used for read-only access. The non-constant +      version returns an unre)HY(stricted)YH( refer)HY(ence)YH( to the member and can +      be used for read-write access. +   )EP( + +   )0 P(The first modi)HY(fier)YH( func)HY(tion)YH( expects an argu)HY(ment)YH( of type refer)HY(ence)YH( to +      constant of the member's type. It makes a deep copy of its argu)HY(ment)YH(. +      Except for member's types that are mapped to funda)HY(men)HY(tal)YH( C++ types, +      the second modi)HY(fier)YH( func)HY(tion)YH( is provided that expects an argu)HY(ment)YH( +      of type auto)HY(matic)YH( pointer \201)SM(std::auto_ptr)ES( or +      )SM(std::unique_ptr)ES(, depend)HY(ing)YH( on the C++ stan)HY(dard)YH( selected\202 +      to the member's type. It assumes owner)HY(ship)YH( of the pointed to object +      and resets the passed auto)HY(matic)YH( pointer. For instance:)EP( + +  ) 5 42 PR(<complexType name="object"> +  <sequence> +    <element name="member" type="string"/> +  </sequence> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 25 47 PR(class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef xml_schema::string member_type; + +  // Accessors. +  // +  const member_type& +  member \201\202 const; + +  member_type& +  member \201\202; + +  // Modifiers. +  // +  void +  member \201const member_type&\202; + +  void +  member \201std::[auto|unique]_ptr<member_type>\202; +  ... + +};)RP( + +   )0 P(In addi)HY(tion)YH(, if requested by spec)HY(i)HY(fy)HY(ing)YH( the )SM(--gener)HY(ate)YH(-detach)ES( +      option and only for members of non-funda)HY(men)HY(tal)YH( C++ types, the mapping +      provides a detach func)HY(tion)YH( that returns an auto)HY(matic)YH( pointer to the +      member's type, for example:)EP( + +  ) 10 37 PR(class object: public xml_schema::type +{ +public: +  ... + +  std::[auto|unique]_ptr<member_type> +  detach_member \201\202; +  ... + +};)RP( + +   )0 P(This func)HY(tion)YH( detaches the value from the tree leaving the member +      value unini)HY(tial)HY(ized)YH(. Access)HY(ing)YH( such an unini)HY(tial)HY(ized)YH( value prior to +      re-initial)HY(iz)HY(ing)YH( it results in unde)HY(fined)YH( behav)HY(ior)YH(.)EP( + +  )0 P(The follow)HY(ing)YH( code shows how one could use this mapping:)EP( + +  ) 25 66 PR(void +f \201object& o\202 +{ +  using xml_schema::string; + +  string s \201o.member \201\202\202;                // get +  object::member_type& sr \201o.member \201\202\202; // get + +  o.member \201"hello"\202;           // set, deep copy +  o.member \201\202 = "hello";        // set, deep copy + +  // C++98 version. +  // +  std::auto_ptr<string> p \201new string \201"hello"\202\202; +  o.member \201p\202;                 // set, assumes ownership +  p = o.detach_member \201\202;       // detach, member is uninitialized +  o.member \201p\202;                 // re-attach + +  // C++11 version. +  // +  std::unique_ptr<string> p \201new string \201"hello"\202\202; +  o.member \201std::move \201p\202\202;     // set, assumes ownership +  p = o.detach_member \201\202;       // detach, member is uninitialized +  o.member \201std::move \201p\202\202;     // re-attach +})RP( + + +)0 3 45 H(2.8.2)WB 142 Sn()WB 49 Sn( Mapping for Members with the Optional Cardi)HY(nal)HY(ity)YH( Class)EA()EH( + +   )0 P(For the Optional cardi)HY(nal)HY(ity)YH( class, the type defi)HY(ni)HY(tions)YH( consist of +      an alias for the member's type with the name created by append)HY(ing)YH( +      the )SM(_type)ES( suffix to the member's name and an alias for +      the container type with the name created by append)HY(ing)YH( the +      )SM(_optional)ES( suffix to the member's name. +   )EP( + +   )0 P(Unlike acces)HY(sor)YH( func)HY(tions)YH( for the One cardi)HY(nal)HY(ity)YH( class, acces)HY(sor)YH( +      func)HY(tions)YH( for the Optional cardi)HY(nal)HY(ity)YH( class return refer)HY(ences)YH( to +      corre)HY(spond)HY(ing)YH( contain)HY(ers)YH( rather than directly to members. The +      acces)HY(sor)YH( func)HY(tions)YH( come in constant and non-constant versions. +      The constant acces)HY(sor)YH( func)HY(tion)YH( returns a constant refer)HY(ence)YH( to +      the container and can be used for read-only access. The non-constant +      version returns an unre)HY(stricted)YH( refer)HY(ence)YH( to the container +      and can be used for read-write access. +   )EP( + +   )0 P(The modi)HY(fier)YH( func)HY(tions)YH( are over)HY(loaded)YH( for the member's +      type and the container type. The first modi)HY(fier)YH( func)HY(tion)YH( +      expects an argu)HY(ment)YH( of type refer)HY(ence)YH( to constant of the +      member's type. It makes a deep copy of its argu)HY(ment)YH(. +      Except for member's types that are mapped to funda)HY(men)HY(tal)YH( C++ types, +      the second modi)HY(fier)YH( func)HY(tion)YH( is provided that expects an argu)HY(ment)YH( +      of type auto)HY(matic)YH( pointer \201)SM(std::auto_ptr)ES( or +      )SM(std::unique_ptr)ES(, depend)HY(ing)YH( on the C++ stan)HY(dard)YH( selected\202 +      to the member's type. It assumes owner)HY(ship)YH( of the pointed to object +      and resets the passed auto)HY(matic)YH( pointer. The last modi)HY(fier)YH( func)HY(tion)YH( +      expects an argu)HY(ment)YH( of type refer)HY(ence)YH( to constant of the container +      type. It makes a deep copy of its argu)HY(ment)YH(. For instance: +   )EP( + +  ) 5 56 PR(<complexType name="object"> +  <sequence> +    <element name="member" type="string" minOccurs="0"/> +  </sequence> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 30 48 PR(class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef xml_schema::string member_type; +  typedef optional<member_type> member_optional; + +  // Accessors. +  // +  const member_optional& +  member \201\202 const; + +  member_optional& +  member \201\202; + +  // Modifiers. +  // +  void +  member \201const member_type&\202; + +  void +  member \201std::[auto|unique]_ptr<member_type>\202; + +  void +  member \201const member_optional&\202; + +  ... + +};)RP( + + +  )0 P(The )SM(optional)ES( class template is defined in an +     imple)HY(men)HY(ta)HY(tion)YH(-specific names)HY(pace)YH( and has the follow)HY(ing)YH( +     inter)HY(face)YH(. The )SM([auto|unique]_ptr)ES(-based construc)HY(tor)YH( +     and modi)HY(fier)YH( func)HY(tion)YH( are only avail)HY(able)YH( if the template +     argu)HY(ment)YH( is not a funda)HY(men)HY(tal)YH( C++ type. +  )EP( + +  ) 97 52 PR(template <typename X> +class optional +{ +public: +  optional \201\202; + +  // Makes a deep copy. +  // +  explicit +  optional \201const X&\202; + +  // Assumes ownership. +  // +  explicit +  optional \201std::[auto|unique]_ptr<X>\202; + +  optional \201const optional&\202; + +public: +  optional& +  operator= \201const X&\202; + +  optional& +  operator= \201const optional&\202; + +  // Pointer-like interface. +  // +public: +  const X* +  operator-> \201\202 const; +)WR( +  X* +  operator-> \201\202; + +  const X& +  operator* \201\202 const; + +  X& +  operator* \201\202; + +  typedef void \201optional::*bool_convertible\202 \201\202; +  operator bool_convertible \201\202 const; + +  // Get/set interface. +  // +public: +  bool +  present \201\202 const; + +  const X& +  get \201\202 const; + +  X& +  get \201\202; + +  // Makes a deep copy. +  // +  void +  set \201const X&\202; + +  // Assumes ownership.)WR( +  // +  void +  set \201std::[auto|unique]_ptr<X>\202; + +  // Detach and return the contained value. +  // +  std::[auto|unique]_ptr<X> +  detach \201\202; + +  void +  reset \201\202; +}; + +template <typename X> +bool +operator== \201const optional<X>&, const optional<X>&\202; + +template <typename X> +bool +operator!= \201const optional<X>&, const optional<X>&\202; + +template <typename X> +bool +operator< \201const optional<X>&, const optional<X>&\202; + +template <typename X> +bool +operator> \201const optional<X>&, const optional<X>&\202; + +template <typename X>)WR( +bool +operator<= \201const optional<X>&, const optional<X>&\202; + +template <typename X> +bool +operator>= \201const optional<X>&, const optional<X>&\202;)RP( + + +  )0 P(The follow)HY(ing)YH( code shows how one could use this mapping:)EP( + +  ) 45 62 PR(void +f \201object& o\202 +{ +  using xml_schema::string; + +  if \201o.member \201\202.present \201\202\202       // test +  { +    string& s \201o.member \201\202.get \201\202\202; // get +    o.member \201"hello"\202;             // set, deep copy +    o.member \201\202.set \201"hello"\202;      // set, deep copy +    o.member \201\202.reset \201\202;           // reset +  } + +  // Same as above but using pointer notation: +  // +  if \201o.member \201\202\202                  // test +  { +    string& s \201*o.member \201\202\202;       // get +    o.member \201"hello"\202;             // set, deep copy +    *o.member \201\202 = "hello";         // set, deep copy +    o.member \201\202.reset \201\202;           // reset +  } + +  // C++98 version. +  // +  std::auto_ptr<string> p \201new string \201"hello"\202\202; +  o.member \201p\202;                     // set, assumes ownership + +  p = new string \201"hello"\202; +  o.member \201\202.set \201p\202;              // set, assumes ownership +)WR( +  p = o.member \201\202.detach \201\202;        // detach, member is reset +  o.member \201\202.set \201p\202;              // re-attach + +  // C++11 version. +  // +  std::unique_ptr<string> p \201new string \201"hello"\202\202; +  o.member \201std::move \201p\202\202;         // set, assumes ownership + +  p.reset \201new string \201"hello"\202\202; +  o.member \201\202.set \201std::move \201p\202\202;  // set, assumes ownership + +  p = o.member \201\202.detach \201\202;        // detach, member is reset +  o.member \201\202.set \201std::move \201p\202\202;  // re-attach +})RP( + + +  )0 3 46 H(2.8.3)WB 143 Sn()WB 50 Sn( Mapping for Members with the Sequence Cardi)HY(nal)HY(ity)YH( Class)EA()EH( + +   )0 P(For the Sequence cardi)HY(nal)HY(ity)YH( class, the type defi)HY(ni)HY(tions)YH( consist of an +      alias for the member's type with the name created by append)HY(ing)YH( +      the )SM(_type)ES( suffix to the member's name, an alias of +      the container type with the name created by append)HY(ing)YH( the +      )SM(_sequence)ES( suffix to the member's name, an alias of +      the iter)HY(a)HY(tor)YH( type with the name created by append)HY(ing)YH( the +      )SM(_iter)HY(a)HY(tor)YH()ES( suffix to the member's name, and an alias +      of the constant iter)HY(a)HY(tor)YH( type with the name created by append)HY(ing)YH( the +      )SM(_const_iter)HY(a)HY(tor)YH()ES( suffix to the member's name. +   )EP( + +   )0 P(The acces)HY(sor)YH( func)HY(tions)YH( come in constant and non-constant versions. +      The constant acces)HY(sor)YH( func)HY(tion)YH( returns a constant refer)HY(ence)YH( to the +      container and can be used for read-only access. The non-constant +      version returns an unre)HY(stricted)YH( refer)HY(ence)YH( to the container and can +      be used for read-write access. +   )EP( + +   )0 P(The modi)HY(fier)YH( func)HY(tion)YH( expects an argu)HY(ment)YH( of type refer)HY(ence)YH( to +      constant of the container type. The modi)HY(fier)YH( func)HY(tion)YH( +      makes a deep copy of its argu)HY(ment)YH(. For instance: +   )EP( + + +  ) 5 64 PR(<complexType name="object"> +  <sequence> +    <element name="member" type="string" minOccurs="unbounded"/> +  </sequence> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 26 64 PR(class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef xml_schema::string member_type; +  typedef sequence<member_type> member_sequence; +  typedef member_sequence::iterator member_iterator; +  typedef member_sequence::const_iterator member_const_iterator; + +  // Accessors. +  // +  const member_sequence& +  member \201\202 const; + +  member_sequence& +  member \201\202; + +  // Modifier. +  // +  void +  member \201const member_sequence&\202; + +  ... + +};)RP( + +  )0 P(The )SM(sequence)ES( class template is defined in an +     imple)HY(men)HY(ta)HY(tion)YH(-specific names)HY(pace)YH(. It conforms to the +     sequence inter)HY(face)YH( as defined by the ISO/ANSI Stan)HY(dard)YH( for +     C++ \201ISO/IEC 14882:1998, Section 23.1.1, "Sequences"\202. +     Prac)HY(ti)HY(cally)YH(, this means that you can treat such a sequence +     as if it was )SM(std::vector)ES(. Two notable exten)HY(sions)YH( +     to the stan)HY(dard)YH( inter)HY(face)YH( that are avail)HY(able)YH( only for +     sequences of non-funda)HY(men)HY(tal)YH( C++ types are the addi)HY(tion)YH( of +     the over)HY(loaded)YH( )SM(push_back)ES( and )SM(insert)ES( +     as well as the )SM(detach_back)ES( and )SM(detach)ES( +     member func)HY(tions)YH(. The addi)HY(tional)YH( )SM(push_back)ES( and +     )SM(insert)ES( func)HY(tions)YH( accept an auto)HY(matic)YH( pointer +     \201)SM(std::auto_ptr)ES( or )SM(std::unique_ptr)ES(, +     depend)HY(ing)YH( on the C++ stan)HY(dard)YH( selected\202 to the +     element type instead of the constant refer)HY(ence)YH(. They assume +     owner)HY(ship)YH( of the pointed to object and reset the passed +     auto)HY(matic)YH( pointer. The )SM(detach_back)ES( and +     )SM(detach)ES( func)HY(tions)YH( detach the element +     value from the sequence container and, by default, remove +     the element from the sequence. These addi)HY(tional)YH( func)HY(tions)YH( +     have the follow)HY(ing)YH( signa)HY(tures)YH(:)EP( + +  ) 22 55 PR(template <typename X> +class sequence +{ +public: +  ... + +  void +  push_back \201std::[auto|unique]_ptr<X>\202 + +  iterator +  insert \201iterator position, std::[auto|unique]_ptr<X>\202 + +  std::[auto|unique]_ptr<X> +  detach_back \201bool pop = true\202; + +  iterator +  detach \201iterator position, +          std::[auto|unique]_ptr<X>& result, +          bool erase = true\202 + +  ... +})RP( + +  )0 P(The follow)HY(ing)YH( code shows how one could use this mapping:)EP( + +  ) 39 66 PR(void +f \201object& o\202 +{ +  using xml_schema::string; + +  object::member_sequence& s \201o.member \201\202\202; + +  // Iteration. +  // +  for \201object::member_iterator i \201s.begin \201\202\202; i != s.end \201\202; ++i\202 +  { +    string& value \201*i\202; +  } + +  // Modification. +  // +  s.push_back \201"hello"\202;  // deep copy + +  // C++98 version. +  // +  std::auto_ptr<string> p \201new string \201"hello"\202\202; +  s.push_back \201p\202;        // assumes ownership +  p = s.detach_back \201\202;   // detach and pop +  s.push_back \201p\202;        // re-append + +  // C++11 version. +  // +  std::unique_ptr<string> p \201new string \201"hello"\202\202; +  s.push_back \201std::move \201p\202\202; // assumes ownership +  p = s.detach_back \201\202;        // detach and pop +  s.push_back \201std::move \201p\202\202; // re-append)WR( + +  // Setting a new container. +  // +  object::member_sequence n; +  n.push_back \201"one"\202; +  n.push_back \201"two"\202; +  o.member \201n\202;           // deep copy +})RP( + +  )0 3 47 H(2.8.4)WB 144 Sn()WB 51 Sn( Element Order)EA()EH( + +  )0 P(C++/Tree is a "flat)HY(ten)HY(ing)YH(" mapping in a sense that many levels of +     nested compos)HY(i)HY(tors)YH( \201)SM(choice)ES( and )SM(sequence)ES(\202, +     all poten)HY(tially)YH( with their own cardi)HY(nal)HY(i)HY(ties)YH(, are in the end mapped +     to a flat set of elements with one of the three cardi)HY(nal)HY(ity)YH( classes +     discussed in the previ)HY(ous)YH( sections. While this results in a simple +     and easy to use API for most types, in certain cases, the order of +     elements in the actual XML docu)HY(ments)YH( is not preserved once parsed +     into the object model. And some)HY(times)YH( such order has +     appli)HY(ca)HY(tion)YH(-specific signif)HY(i)HY(cance)YH(. As an example, consider a schema +     that defines a batch of bank trans)HY(ac)HY(tions)YH(:)EP( + +  ) 20 48 PR(<complexType name="withdraw"> +  <sequence> +    <element name="account" type="unsignedInt"/> +    <element name="amount" type="unsignedInt"/> +  </sequence> +</complexType> + +<complexType name="deposit"> +  <sequence> +    <element name="account" type="unsignedInt"/> +    <element name="amount" type="unsignedInt"/> +  </sequence> +</complexType> + +<complexType name="batch"> +  <choice minOccurs="0" maxOccurs="unbounded"> +    <element name="withdraw" type="withdraw"/> +    <element name="deposit" type="deposit"/> +  </choice> +</complexType>)RP( + +  )0 P(The batch can contain any number of trans)HY(ac)HY(tions)YH( in any order +     but the order of trans)HY(ac)HY(tions)YH( in each actual batch is signif)HY(i)HY(cant)YH(. +     For instance, consider what could happen if we reorder the +     trans)HY(ac)HY(tions)YH( and apply all the with)HY(drawals)YH( before deposits.)EP( + +  )0 P(For the )SM(batch)ES( schema type defined above the default +     C++/Tree mapping will produce a C++ class that contains a pair of +     sequence contain)HY(ers)YH(, one for each of the two elements. While this +     will capture the content \201trans)HY(ac)HY(tions)YH(\202, the order of this content +     as it appears in XML will be lost. Also, if we try to seri)HY(al)HY(ize)YH( the +     batch we just loaded back to XML, all the with)HY(drawal)YH( trans)HY(ac)HY(tions)YH( +     will appear before deposits.)EP( + +  )0 P(To over)HY(come)YH( this limi)HY(ta)HY(tion)YH( of a flat)HY(ten)HY(ing)YH( mapping, C++/Tree +     allows us to mark certain XML Schema types, for which content +     order is impor)HY(tant)YH(, as ordered.)EP( + +  )0 P(There are several command line options that control which +     schema types are treated as ordered. To make an indi)HY(vid)HY(ual)YH( +     type ordered, we use the )SM(--ordered-type)ES( option, +     for example:)EP( + +  ) 1 20 PR(--ordered-type batch)RP( + +  )0 P(To auto)HY(mat)HY(i)HY(cally)YH( treat all the types that are derived from an ordered +     type also ordered, we use the )SM(--ordered-type-derived)ES( +     option. This is primar)HY(ily)YH( useful if you would like to iterate +     over the complete hier)HY(ar)HY(chy)YH('s content using the content order +     sequence \201discussed below\202.)EP( + +  )0 P(Ordered types are also useful for handling mixed content. To +     auto)HY(mat)HY(i)HY(cally)YH( mark all the types with mixed content as ordered +     we use the )SM(--ordered-type-mixed)ES( option. For more +     infor)HY(ma)HY(tion)YH( on handling mixed content see )0 63 1 A(Section +     2.13, "Mapping for Mixed Content Models")63 0 TN TL()Ec /AF f D(.)EP( + +  )0 P(Finally, we can mark all the types in the schema we are +     compil)HY(ing)YH( with the )SM(--ordered-type-all)ES( option. +     You should only resort to this option if all the types in +     your schema truly suffer from the loss of content +     order since, as we will discuss shortly, ordered types +     require extra effort to access and, espe)HY(cially)YH(, modify. +     See the +     )R8 2 A(XSD +     Compiler Command Line Manual)EA( for more infor)HY(ma)HY(tion)YH( on +     these options.)EP( + +  )0 P(Once a type is marked ordered, C++/Tree alters its mapping +     in several ways. Firstly, for each local element, element +     wild)HY(card)YH( \201)0 61 1 A(Section 2.12.4, "Element Wild)HY(card)YH( +     Order")61 0 TN TL()Ec /AF f D(\202, and mixed content text \201)0 63 1 A(Section +     2.13, "Mapping for Mixed Content Models")63 0 TN TL()Ec /AF f D(\202 in this type, a +     content id constant is gener)HY(ated)YH(. Secondly, an addi)HY(tion)YH( sequence +     is added to the class that captures the content order. Here +     is how the mapping of our )SM(batch)ES( class changes +     once we make it ordered:)EP( + +  ) 57 78 PR(class batch: public xml_schema::type +{ +public: +  // withdraw +  // +  typedef withdraw withdraw_type; +  typedef sequence<withdraw_type> withdraw_sequence; +  typedef withdraw_sequence::iterator withdraw_iterator; +  typedef withdraw_sequence::const_iterator withdraw_const_iterator; + +  static const std::size_t withdraw_id = 1; + +  const withdraw_sequence& +  withdraw \201\202 const; + +  withdraw_sequence& +  withdraw \201\202; + +  void +  withdraw \201const withdraw_sequence&\202; + +  // deposit +  // +  typedef deposit deposit_type; +  typedef sequence<deposit_type> deposit_sequence; +  typedef deposit_sequence::iterator deposit_iterator; +  typedef deposit_sequence::const_iterator deposit_const_iterator; + +  static const std::size_t deposit_id = 2; + +  const deposit_sequence&)WR( +  deposit \201\202 const; + +  deposit_sequence& +  deposit \201\202; + +  void +  deposit \201const deposit_sequence&\202; + +  // content_order +  // +  typedef xml_schema::content_order content_order_type; +  typedef std::vector<content_order_type> content_order_sequence; +  typedef content_order_sequence::iterator content_order_iterator; +  typedef content_order_sequence::const_iterator content_order_const_iterator; + +  const content_order_sequence& +  content_order \201\202 const; + +  content_order_sequence& +  content_order \201\202; + +  void +  content_order \201const content_order_sequence&\202; + +  ... +};)RP( + +  )0 P(Notice the )SM(with)HY(draw)YH(_id)ES( and )SM(deposit_id)ES( +     content ids as well as the extra )SM(content_order)ES( +     sequence that does not corre)HY(spond)YH( to any element in the +     schema defi)HY(ni)HY(tion)YH(. The other changes to the mapping for ordered +     types has to do with XML parsing and seri)HY(al)HY(iza)HY(tion)YH( code. During +     parsing the content order is captured in the )SM(content_order)ES( +     sequence while during seri)HY(al)HY(iza)HY(tion)YH( this sequence is used to +     deter)HY(mine)YH( the order in which content is seri)HY(al)HY(ized)YH(. The +     )SM(content_order)ES( sequence is also copied during +     copy construc)HY(tion)YH( and assigned during copy assign)HY(ment)YH(. It is also +     taken into account during compar)HY(i)HY(son)YH(.)EP( + +  )0 P(The entry type of the )SM(content_order)ES( sequence is the +     )SM(xml_schema::content_order)ES( type that has the follow)HY(ing)YH( +     inter)HY(face)YH(:)EP( + +  ) 19 58 PR(namespace xml_schema +{ +  struct content_order +  { +    content_order \201std::size_t id, std::size_t index = 0\202; + +    std::size_t id; +    std::size_t index; +  }; + +  bool +  operator== \201const content_order&, const content_order&\202; + +  bool +  operator!= \201const content_order&, const content_order&\202; + +  bool +  operator< \201const content_order&, const content_order&\202; +})RP( + +  )0 P(The )SM(content_order)ES( sequence describes the order of +     content \201elements, includ)HY(ing)YH( wild)HY(cards)YH(, as well as mixed content +     text\202. Each entry in this sequence consists of the content id +     \201for example, )SM(with)HY(draw)YH(_id)ES( or )SM(deposit_id)ES( +     in our case\202 as well as, for elements of the sequence cardi)HY(nal)HY(ity)YH( +     class, an index into the corre)HY(spond)HY(ing)YH( sequence container \201the +     index is unused for the one and optional cardi)HY(nal)HY(ity)YH( classes\202. +     For example, in our case, if the content id is )SM(with)HY(draw)YH(_id)ES(, +     then the index will point into the )SM(with)HY(draw)YH()ES( element +     sequence.)EP( + +  )0 P(With all this infor)HY(ma)HY(tion)YH( we can now examine how to iterate over +     trans)HY(ac)HY(tion)YH( in the batch in content order:)EP( + +  ) 26 73 PR(batch& b = ... + +for \201batch::content_order_const_iterator i \201b.content_order \201\202.begin \201\202\202; +     i != b.content_order \201\202.end \201\202; +     ++i\202 +{ +  switch \201i->id\202 +  { +  case batch::withdraw_id: +    { +      const withdraw& t \201b.withdraw \201\202[i->index]\202; +      cerr << t.account \201\202 << " withdraw " << t.amount \201\202 << endl; +      break; +    } +  case batch::deposit_id: +    { +      const deposit& t \201b.deposit \201\202[i->index]\202; +      cerr << t.account \201\202 << " deposit " << t.amount \201\202 << endl; +      break; +    } +  default: +    { +      assert \201false\202; // Unknown content id. +    } +  } +})RP( + +  )0 P(If we seri)HY(al)HY(ized)YH( our batch back to XML, we would also see that the +     order of trans)HY(ac)HY(tions)YH( in the output is exactly the same as in the +     input rather than all the with)HY(drawals)YH( first followed by all the +     deposits.)EP( + +  )0 P(The most complex aspect of working with ordered types is +     modi)HY(fi)HY(ca)HY(tions)YH(. Now we not only need to change the content, +     but also remem)HY(ber)YH( to update the order infor)HY(ma)HY(tion)YH( corre)HY(spond)HY(ing)YH( +     to this change. As a first example, we add a deposit trans)HY(ac)HY(tion)YH( +     to the batch:)EP( + +  ) 8 64 PR(using xml_schema::content_order; + +batch::deposit_sequence& d \201b.deposit \201\202\202; +batch::withdraw_sequence& w \201b.withdraw \201\202\202; +batch::content_order_sequence& co \201b.content_order \201\202\202; + +d.push_back \201deposit \201123456789, 100000\202\202; +co.push_back \201content_order \201batch::deposit_id, d.size \201\202 - 1\202\202;)RP( + +  )0 P(In the above example we first added the content \201deposit +     trans)HY(ac)HY(tion)YH(\202 and then updated the content order infor)HY(ma)HY(tion)YH( +     by adding an entry with )SM(deposit_id)ES( content +     id and the index of the just added deposit trans)HY(ac)HY(tion)YH(.)EP( + +  )0 P(Remov)HY(ing)YH( the last trans)HY(ac)HY(tion)YH( can be easy if we know which +     trans)HY(ac)HY(tion)YH( \201deposit or with)HY(drawal)YH(\202 is last:)EP( + +  ) 2 15 PR(d.pop_back \201\202; +co.pop_back \201\202;)RP( + +  )0 P(If, however, we do not know which trans)HY(ac)HY(tion)YH( is last, then +     things get a bit more compli)HY(cated)YH(:)EP( + +  ) 15 24 PR(switch \201co.back \201\202.id\202 +{ +case batch::withdraw_id: +  { +    d.pop_back \201\202; +    break; +  } +case batch::deposit_id: +  { +    w.pop_back \201\202; +    break; +  } +} + +co.pop_back \201\202;)RP( + +  )0 P(The follow)HY(ing)YH( example shows how to add a trans)HY(ac)HY(tion)YH( at the +     begin)HY(ning)YH( of the batch:)EP( + +  ) 3 62 PR(w.push_back \201withdraw \201123456789, 100000\202\202; +co.insert \201co.begin \201\202, +           content_order \201batch::withdraw_id, w.size \201\202 - 1\202\202;)RP( + +  )0 P(Note also that when we merely modify the content of one +     of the elements in place, we do not need to update its +     order since it doesn't change. For example, here is how +     we can change the amount in the first with)HY(drawal)YH(:)EP( + +  ) 1 20 PR(w[0].amount \20110000\202;)RP( + +  )0 P(For the complete working code shown in this section refer to the +     )SM(order/element)ES( example in the +     )SM(exam)HY(ples)YH(/cxx/tree/)ES( direc)HY(tory)YH( in the XSD distri)HY(bu)HY(tion)YH(.)EP( + +  )0 P(If both the base and derived types are ordered, then the +     content order sequence is only added to the base and the content +     ids are unique within the whole hier)HY(ar)HY(chy)YH(. In this case +     the content order sequence for the derived type contains +     order)HY(ing)YH( infor)HY(ma)HY(tion)YH( for both base and derived content.)EP( + +  )0 P(In some appli)HY(ca)HY(tions)YH( we may need to perform more complex +     content process)HY(ing)YH(. For example, in our case, we may need +     to remove all the with)HY(drawal)YH( trans)HY(ac)HY(tions)YH(. The default +     container, )SM(std::vector)ES(, is not partic)HY(u)HY(larly)YH( +     suit)HY(able)YH( for such oper)HY(a)HY(tions)YH(. What may be required by +     some appli)HY(ca)HY(tions)YH( is a multi-index container that not +     only allows us to iterate in content order similar to +     )SM(std::vector)ES( but also search by the content +     id as well as the content id and index pair.)EP( + +  )0 P(While C++/Tree does not provide this func)HY(tion)HY(al)HY(ity)YH( by +     default, it allows us to specify a custom container +     type for content order with the )SM(--order-container)ES( +     command line option. The only require)HY(ment)YH( from the +     gener)HY(ated)YH( code side for such a container is to provide +     the )SM(vector)ES(-like )SM(push_back\201\202)ES(, +     )SM(size\201\202)ES(, and const iter)HY(a)HY(tion)YH( inter)HY(faces)YH(.)EP( + +  )0 P(As an example, here is how we can use the Boost Multi-Index +     container for content order. First we create the +     )SM(content-order-container.hxx)ES( header with the +     follow)HY(ing)YH( defi)HY(ni)HY(tion)YH( \201in C++11, use the alias template +     instead\202:)EP( + +  ) 33 58 PR(#ifndef CONTENT_ORDER_CONTAINER +#define CONTENT_ORDER_CONTAINER + +#include <cstddef> // std::size_t + +#include <boost/multi_index_container.hpp> +#include <boost/multi_index/member.hpp> +#include <boost/multi_index/identity.hpp> +#include <boost/multi_index/ordered_index.hpp> +#include <boost/multi_index/random_access_index.hpp> + +struct by_id {}; +struct by_id_index {}; + +template <typename T> +struct content_order_container: +  boost::multi_index::multi_index_container< +    T, +    boost::multi_index::indexed_by< +      boost::multi_index::random_access<>, +      boost::multi_index::ordered_unique< +        boost::multi_index::tag<by_id_index>, +        boost::multi_index::identity<T> +      >, +      boost::multi_index::ordered_non_unique< +        boost::multi_index::tag<by_id>, +        boost::multi_index::member<T, std::size_t, &T::id> +      > +    > +  > +{};)WR( + +#endif)RP( + +  )0 P(Next we add the follow)HY(ing)YH( two XSD compiler options to include +     this header into every gener)HY(ated)YH( header file and to use the +     custom container type \201see the XSD compiler command line manual +     for more infor)HY(ma)HY(tion)YH( on shell quoting for the first option\202:)EP( + +  ) 2 55 PR(--hxx-prologue '#include "content-order-container.hxx"' +--order-container content_order_container)RP( + +  )0 P(With these changes we can now use the multi-index func)HY(tion)HY(al)HY(ity)YH(, +     for example, to search for a specific content id:)EP( + +  ) 13 65 PR(typedef batch::content_order_sequence::index<by_id>::type id_set; +typedef id_set::iterator id_iterator; + +const id_set& ids \201b.content_order \201\202.get<by_id> \201\202\202; + +std::pair<id_iterator, id_iterator> r \201 +  ids.equal_range \201std::size_t \201batch::deposit_id\202\202; + +for \201id_iterator i \201r.first\202; i != r.second; ++i\202 +{ +  const deposit& t \201b.deposit \201\202[i->index]\202; +  cerr << t.account \201\202 << " deposit " << t.amount \201\202 << endl; +})RP( + +  )0 2 48 H(2.9)WB 145 Sn()WB 52 Sn( Mapping for Global Elements)EA()EH( + +  )0 P(An XML Schema element defi)HY(ni)HY(tion)YH( is called global if it appears +     directly under the )SM(schema)ES( element. +     A global element is a valid root of an instance docu)HY(ment)YH(. By +     default, a global element is mapped to a set of over)HY(loaded)YH( +     parsing and, option)HY(ally)YH(, seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( with the +     same name as the element. It is also possi)HY(ble)YH( to gener)HY(ate)YH( types +     for root elements instead of parsing and seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH(. +     This is primar)HY(ily)YH( useful to distin)HY(guish)YH( object models with the +     same root type but with differ)HY(ent)YH( root elements. See +     )0 53 1 A(Section 2.9.1, "Element Types")53 0 TN TL()Ec /AF f D( for details. +     It is also possi)HY(ble)YH( to request the gener)HY(a)HY(tion)YH( of an element map +     which allows uniform parsing and seri)HY(al)HY(iza)HY(tion)YH( of multi)HY(ple)YH( root +     elements. See )0 54 1 A(Section 2.9.2, "Element Map")54 0 TN TL()Ec /AF f D( +     for details. +  )EP( + +  )0 P(The parsing func)HY(tions)YH( read XML instance docu)HY(ments)YH( and return +     corre)HY(spond)HY(ing)YH( object models as an auto)HY(matic)YH( pointer +     \201)SM(std::auto_ptr)ES( or )SM(std::unique_ptr)ES(, +     depend)HY(ing)YH( on the C++ stan)HY(dard)YH( selected\202. Their signa)HY(tures)YH( +     have the follow)HY(ing)YH( pattern \201)SM(type)ES( denotes +     element's type and )SM(name)ES( denotes element's +     name\202: +  )EP( + +  ) 2 28 PR(std::[auto|unique]_ptr<type> +name \201....\202;)RP( + +  )0 P(The process of parsing, includ)HY(ing)YH( the exact signa)HY(tures)YH( of the parsing +     func)HY(tions)YH(, is the subject of )0 64 1 A(Chapter 3, "Parsing")64 0 TN TL()Ec /AF f D(. +  )EP( + +  )0 P(The seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( write object models back to XML instance +     docu)HY(ments)YH(. Their signa)HY(tures)YH( have the follow)HY(ing)YH( pattern: +  )EP( + +  ) 2 41 PR(void +name \201<stream type>&, const type&, ....\202;)RP( + +  )0 P(The process of seri)HY(al)HY(iza)HY(tion)YH(, includ)HY(ing)YH( the exact signa)HY(tures)YH( of the +     seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH(, is the subject of )0 81 1 A(Chapter 4, +     "Seri)HY(al)HY(iza)HY(tion)YH(")81 0 TN TL()Ec /AF f D(. +  )EP( + + +  )0 3 49 H(2.9.1)WB 146 Sn()WB 53 Sn( Element Types)EA()EH( + +  )0 P(The gener)HY(a)HY(tion)YH( of element types is requested with the +     )SM(--gener)HY(ate)YH(-element-map)ES( option. With this option +     each global element is mapped to a C++ class with the +     same name as the element. Such a class is derived from +     )SM(xml_schema::element_type)ES( and contains the same set +     of type defi)HY(ni)HY(tions)YH(, construc)HY(tors)YH(, and member func)HY(tion)YH( as would a +     type contain)HY(ing)YH( a single element with the One cardi)HY(nal)HY(ity)YH( class +     named )SM("value")ES(. In addi)HY(tion)YH(, the element type also +     contains a set of member func)HY(tions)YH( for access)HY(ing)YH( the element +     name and names)HY(pace)YH( as well as its value in a uniform manner. +     For example:)EP( + +  ) 7 34 PR(<complexType name="type"> +  <sequence> +    ... +  </sequence> +</complexType> + +<element name="root" type="type"/>)RP( + +)0 P(is mapped to:)EP( + +  ) 62 59 PR(class type +{ +  ... +}; + +class root: public xml_schema::element_type +{ +public: +  // Element value. +  // +  typedef type value_type; + +  const value_type& +  value \201\202 const; + +  value_type& +  value \201\202; + +  void +  value \201const value_type&\202; + +  void +  value \201std::[auto|unique]_ptr<value_type>\202; + +  // Constructors. +  // +  root \201const value_type&\202; + +  root \201std::[auto|unique]_ptr<value_type>\202; + +  root \201const xercesc::DOMElement&, xml_schema::flags = 0\202;)WR( + +  root \201const root&, xml_schema::flags = 0\202; + +  virtual root* +  _clone \201xml_schema::flags = 0\202 const; + +  // Element name and namespace. +  // +  static const std::string& +  name \201\202; + +  static const std::string& +  namespace_ \201\202; + +  virtual const std::string& +  _name \201\202 const; + +  virtual const std::string& +  _namespace \201\202 const; + +  // Element value as xml_schema::type. +  // +  virtual const xml_schema::type* +  _value \201\202 const; + +  virtual xml_schema::type* +  _value \201\202; +}; + +void)WR( +operator<< \201xercesc::DOMElement&, const root&\202;)RP( + +  )0 P(The )SM(xml_schema::element_type)ES( class is a common +     base type for all element types and is defined as follows:)EP( + +  ) 24 39 PR(namespace xml_schema +{ +  class element_type +  { +  public: +    virtual +    ~element_type \201\202; + +    virtual element_type* +    _clone \201flags f = 0\202 const = 0; + +    virtual const std::basic_string<C>& +    _name \201\202 const = 0; + +    virtual const std::basic_string<C>& +    _namespace \201\202 const = 0; + +    virtual xml_schema::type* +    _value \201\202 = 0; + +    virtual const xml_schema::type* +    _value \201\202 const = 0; +  }; +})RP( + +  )0 P(The )SM(_value\201\202)ES( member func)HY(tion)YH( returns a pointer to +     the element value or 0 if the element is of a funda)HY(men)HY(tal)YH( C++ +     type and there)HY(fore)YH( is not derived from )SM(xml_schema::type)ES(. +  )EP( + +  )0 P(Unlike parsing and seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH(, element types +     are only capable of parsing and seri)HY(al)HY(iz)HY(ing)YH( from/to a +     )SM(DOMEle)HY(ment)YH()ES( object. This means that the appli)HY(ca)HY(tion)YH( +     will need to perform its own XML-to-DOM parsing and DOM-to-XML +     seri)HY(al)HY(iza)HY(tion)YH(. The follow)HY(ing)YH( section describes a mech)HY(a)HY(nism)YH( +     provided by the mapping to uniformly parse and seri)HY(al)HY(ize)YH( +     multi)HY(ple)YH( root elements.)EP( + + +  )0 3 50 H(2.9.2)WB 147 Sn()WB 54 Sn( Element Map)EA()EH( + +  )0 P(When element types are gener)HY(ated)YH( for root elements it is also +     possi)HY(ble)YH( to request the gener)HY(a)HY(tion)YH( of an element map with the +     )SM(--gener)HY(ate)YH(-element-map)ES( option. The element map +     allows uniform parsing and seri)HY(al)HY(iza)HY(tion)YH( of multi)HY(ple)YH( root +     elements via the common )SM(xml_schema::element_type)ES( +     base type. The )SM(xml_schema::element_map)ES( class is +     defined as follows:)EP( + +  ) 12 59 PR(namespace xml_schema +{ +  class element_map +  { +  public: +    static std::[auto|unique]_ptr<xml_schema::element_type> +    parse \201const xercesc::DOMElement&, flags = 0\202; + +    static void +    serialize \201xercesc::DOMElement&, const element_type&\202; +  }; +})RP( + +  )0 P(The )SM(parse\201\202)ES( func)HY(tion)YH( creates the corre)HY(spond)HY(ing)YH( +     element type object based on the element name and names)HY(pace)YH( +     and returns it as an auto)HY(matic)YH( pointer \201)SM(std::auto_ptr)ES( +     or )SM(std::unique_ptr)ES(, depend)HY(ing)YH( on the C++ stan)HY(dard)YH( +     selected\202 to )SM(xml_schema::element_type)ES(. +     The )SM(seri)HY(al)HY(ize)YH(\201\202)ES( func)HY(tion)YH( seri)HY(al)HY(izes)YH( the passed element +     object to )SM(DOMEle)HY(ment)YH()ES(. Note that in case of +     )SM(seri)HY(al)HY(ize)YH(\201\202)ES(, the )SM(DOMEle)HY(ment)YH()ES( object +     should have the correct name and names)HY(pace)YH(. If no element type is +     avail)HY(able)YH( for an element, both func)HY(tions)YH( throw the +     )SM(xml_schema::no_element_info)ES( excep)HY(tion)YH(:)EP( + +  ) 14 66 PR(struct no_element_info: virtual exception +{ +  no_element_info \201const std::basic_string<C>& element_name, +                   const std::basic_string<C>& element_namespace\202; + +  const std::basic_string<C>& +  element_name \201\202 const; + +  const std::basic_string<C>& +  element_namespace \201\202 const; + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The appli)HY(ca)HY(tion)YH( can discover the actual type of the element +     object returned by )SM(parse\201\202)ES( either using +     )SM(dynamic_cast)ES( or by compar)HY(ing)YH( element names and +     names)HY(paces)YH(. The follow)HY(ing)YH( code frag)HY(ments)YH( illus)HY(trate)YH( how the +     element map can be used:)EP( + +  ) 18 50 PR(// Parsing. +// +DOMElement& e = ... // Parse XML to DOM. + +auto_ptr<xml_schema::element_type> r \201 +  xml_schema::element_map::parse \201e\202\202; + +if \201root1 r1 = dynamic_cast<root1*> \201r.get \201\202\202\202 +{ +  ... +} +else if \201r->_name == root2::name \201\202 && +         r->_namespace \201\202 == root2::namespace_ \201\202\202 +{ +  root2& r2 \201static_cast<root2&> \201*r\202\202; + +  ... +})RP( + +  ) 13 68 PR(// Serialization. +// +xml_schema::element_type& r = ... + +string name \201r._name \201\202\202; +string ns \201r._namespace \201\202\202; + +DOMDocument& doc = ... // Create a new DOMDocument with name and ns. +DOMElement& e \201*doc->getDocumentElement \201\202\202; + +xml_schema::element_map::serialize \201e, r\202; + +// Serialize DOMDocument to XML.)RP( + +   + +  )0 2 51 H(2.10)WB 148 Sn()WB 55 Sn( Mapping for Global Attributes)EA()EH( + +  )0 P(An XML Schema attribute defi)HY(ni)HY(tion)YH( is called global if it appears +     directly under the )SM(schema)ES( element. A global +     attribute does not have any mapping. +  )EP( + +   + +  )0 2 52 H(2.11)WB 149 Sn()WB 56 Sn( Mapping for )SM(xsi:type)ES( and Substi)HY(tu)HY(tion)YH( +      Groups)EA()EH( + +  )0 P(The mapping provides optional support for the XML Schema poly)HY(mor)HY(phism)YH( +     features \201)SM(xsi:type)ES( and substi)HY(tu)HY(tion)YH( groups\202 which can +     be requested with the )SM(--gener)HY(ate)YH(-poly)HY(mor)HY(phic)YH()ES( option. +     When used, the dynamic type of a member may be differ)HY(ent)YH( from +     its static type. Consider the follow)HY(ing)YH( schema defi)HY(ni)HY(tion)YH( and +     instance docu)HY(ment)YH(: +  )EP( + +  ) 28 62 PR(<!-- test.xsd --> +<schema> +  <complexType name="base"> +    <attribute name="text" type="string"/> +  </complexType> + +  <complexType name="derived"> +    <complexContent> +      <extension base="base"> +        <attribute name="extra-text" type="string"/> +      </extension> +    </complexContent> +  </complexType> + +  <complexType name="root_type"> +    <sequence> +      <element name="item" type="base" maxOccurs="unbounded"/> +    </sequence> +  </complexType> + +  <element name="root" type="root_type"/> +</schema> + +<!-- test.xml --> +<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> +  <item text="hello"/> +  <item text="hello" extra-text="world" xsi:type="derived"/> +</root>)RP( + +  )0 P(In the result)HY(ing)YH( object model, the container for +     the )SM(root::item)ES( member will have two elements: +     the first element's type will be )SM(base)ES( while +     the second element's \201dynamic\202 type will be +     )SM(derived)ES(. This can be discov)HY(ered)YH( using the +     )SM(dynamic_cast)ES( oper)HY(a)HY(tor)YH( as shown in the follow)HY(ing)YH( +     example: +  )EP( + +  ) 17 56 PR(void +f \201root& r\202 +{ +  for \201root::item_const_iterator i \201r.item \201\202.begin \201\202\202; +       i != r.item \201\202.end \201\202 +       ++i\202 +  { +    if \201derived* d = dynamic_cast<derived*> \201&\201*i\202\202\202 +    { +      // derived +    } +    else +    { +      // base +    } +  } +})RP( + +  )0 P(The )SM(_clone)ES( virtual func)HY(tion)YH( should be used instead of +     copy construc)HY(tors)YH( to make copies of members that might use +     poly)HY(mor)HY(phism)YH(: +  )EP( + +  ) 10 56 PR(void +f \201root& r\202 +{ +  for \201root::item_const_iterator i \201r.item \201\202.begin \201\202\202; +       i != r.item \201\202.end \201\202 +       ++i\202 +  { +    std::auto_ptr<base> c \201i->_clone \201\202\202; +  } +})RP( + +  )0 P(The mapping can often auto)HY(mat)HY(i)HY(cally)YH( deter)HY(mine)YH( which types are +     poly)HY(mor)HY(phic)YH( based on the substi)HY(tu)HY(tion)YH( group decla)HY(ra)HY(tions)YH(. However, +     if your XML vocab)HY(u)HY(lary)YH( is not using substi)HY(tu)HY(tion)YH( groups or if +     substi)HY(tu)HY(tion)YH( groups are defined in a sepa)HY(rate)YH( schema, then you will +     need to use the )SM(--poly)HY(mor)HY(phic)YH(-type)ES( option to specify +     which types are poly)HY(mor)HY(phic)YH(. When using this option you only need +     to specify the root of a poly)HY(mor)HY(phic)YH( type hier)HY(ar)HY(chy)YH( and the mapping +     will assume that all the derived types are also poly)HY(mor)HY(phic)YH(. +     Also note that you need to specify this option when compil)HY(ing)YH( every +     schema file that refer)HY(ences)YH( the poly)HY(mor)HY(phic)YH( type. Consider the follow)HY(ing)YH( +     two schemas as an example:)EP( + +  ) 13 55 PR(<!-- base.xsd --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + +  <xs:complexType name="base"> +    <xs:sequence> +      <xs:element name="b" type="xs:int"/> +    </xs:sequence> +  </xs:complexType> + +  <!-- substitution group root --> +  <xs:element name="base" type="base"/> + +</xs:schema>)RP( + +  ) 18 70 PR(<!-- derived.xsd --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + +  <include schemaLocation="base.xsd"/> + +  <xs:complexType name="derived"> +    <xs:complexContent> +      <xs:extension base="base"> +        <xs:sequence> +          <xs:element name="d" type="xs:string"/> +        </xs:sequence> +      </xs:extension> +    </xs:complexContent> +  </xs:complexType> + +  <xs:element name="derived" type="derived" substitutionGroup="base"/> + +</xs:schema>)RP( + +  )0 P(In this example we need to specify ")SM(--poly)HY(mor)HY(phic)YH(-type base)ES(" +     when compil)HY(ing)YH( both schemas because the substi)HY(tu)HY(tion)YH( group is declared +     in a schema other than the one defin)HY(ing)YH( type )SM(base)ES(.)EP( + +  )0 P(You can also indi)HY(cate)YH( that all types should be treated as poly)HY(mor)HY(phic)YH( +     with the )SM(--poly)HY(mor)HY(phic)YH(-type-all)ES(. However, this may result +     in slower gener)HY(ated)YH( code with a greater foot)HY(print)YH(.)EP( + + +   + + +  )0 2 53 H(2.12)WB 150 Sn()WB 57 Sn( Mapping for )SM(any)ES( and )SM(anyAt)HY(tribute)YH()ES()EA()EH( + +  )0 P(For the XML Schema )SM(any)ES( and )SM(anyAt)HY(tribute)YH()ES( +     wild)HY(cards)YH( an optional mapping can be requested with the +     )SM(--gener)HY(ate)YH(-wild)HY(card)YH()ES( option. The mapping repre)HY(sents)YH( +     the content matched by wild)HY(cards)YH( as DOM frag)HY(ments)YH(. Because the +     DOM API is used to access such content, the Xerces-C++ runtime +     should be initial)HY(ized)YH( by the appli)HY(ca)HY(tion)YH( prior to parsing and +     should remain initial)HY(ized)YH( for the life)HY(time)YH( of objects with +     the wild)HY(card)YH( content. For more infor)HY(ma)HY(tion)YH( on the Xerces-C++ +     runtime initial)HY(iza)HY(tion)YH( see )0 65 1 A(Section 3.1, +     "Initial)HY(iz)HY(ing)YH( the Xerces-C++ Runtime")65 0 TN TL()Ec /AF f D(. +  )EP( + +  )0 P(The mapping for )SM(any)ES( is similar to the mapping for +     local elements \201see )0 47 1 A(Section 2.8, "Mapping for Local +     Elements and Attributes")47 0 TN TL()Ec /AF f D(\202 except that the type used in the +     wild)HY(card)YH( mapping is )SM(xercesc::DOMEle)HY(ment)YH()ES(. As with local +     elements, the mapping divides all possi)HY(ble)YH( cardi)HY(nal)HY(ity)YH( combi)HY(na)HY(tions)YH( +     into three cardi)HY(nal)HY(ity)YH( classes: )I(one)ES(, )I(optional)ES(, and +     )I(sequence)ES(. +  )EP( + +  )0 P(The mapping for )SM(anyAt)HY(tribute)YH()ES( repre)HY(sents)YH( the attributes +     matched by this wild)HY(card)YH( as a set of )SM(xercesc::DOMAttr)ES( +     objects with a key being the attribute's name and names)HY(pace)YH(.)EP( + +  )0 P(Similar to local elements and attributes, the )SM(any)ES( and +     )SM(anyAt)HY(tribute)YH()ES( wild)HY(cards)YH( are mapped to a set of public type +     defi)HY(ni)HY(tions)YH( \201type)HY(defs)YH(\202 and a set of public acces)HY(sor)YH( and modi)HY(fier)YH( +     func)HY(tions)YH(. Type defi)HY(ni)HY(tions)YH( have names derived from )SM("any")ES( +     for the )SM(any)ES( wild)HY(card)YH( and )SM("any_attribute")ES( +     for the )SM(anyAt)HY(tribute)YH()ES( wild)HY(card)YH(. The acces)HY(sor)YH( and modi)HY(fier)YH( +     func)HY(tions)YH( are named )SM("any")ES( for the )SM(any)ES( wild)HY(card)YH( +     and )SM("any_attribute")ES( for the )SM(anyAt)HY(tribute)YH()ES( +     wild)HY(card)YH(. Subse)HY(quent)YH( wild)HY(cards)YH( in the same type have escaped names +     such as )SM("any1")ES( or )SM("any_attribute1")ES(. +  )EP( + +  )0 P(Because Xerces-C++ DOM nodes always belong to a )SM(DOMDoc)HY(u)HY(ment)YH()ES(, +     each type with a wild)HY(card)YH( has an asso)HY(ci)HY(ated)YH( )SM(DOMDoc)HY(u)HY(ment)YH()ES( +     object. The refer)HY(ence)YH( to this object can be obtained using the acces)HY(sor)YH( +     func)HY(tion)YH( called )SM(dom_docu)HY(ment)YH()ES(. The access to the docu)HY(ment)YH( +     object from the appli)HY(ca)HY(tion)YH( code may be neces)HY(sary)YH( to create or modify +     the wild)HY(card)YH( content. For example: +  )EP( + +  ) 6 37 PR(<complexType name="object"> +  <sequence> +    <any namespace="##other"/> +  </sequence> +  <anyAttribute namespace="##other"/> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 37 73 PR(class object: public xml_schema::type +{ +public: +  // any +  // +  const xercesc::DOMElement& +  any \201\202 const; + +  void +  any \201const xercesc::DOMElement&\202; + +  ... + +  // any_attribute +  // +  typedef attribute_set any_attribute_set; +  typedef any_attribute_set::iterator any_attribute_iterator; +  typedef any_attribute_set::const_iterator any_attribute_const_iterator; + +  const any_attribute_set& +  any_attribute \201\202 const; + +  any_attribute_set& +  any_attribute \201\202; + +  ... + +  // DOMDocument object for wildcard content. +  // +  const xercesc::DOMDocument& +  dom_document \201\202 const;)WR( + +  xercesc::DOMDocument& +  dom_document \201\202; + +  ... +};)RP( + + +  )0 P(Names and seman)HY(tics)YH( of type defi)HY(ni)HY(tions)YH( for the wild)HY(cards)YH( as well +     as signa)HY(tures)YH( of the acces)HY(sor)YH( and modi)HY(fier)YH( func)HY(tions)YH( depend on the +     wild)HY(card)YH( type as well as the cardi)HY(nal)HY(ity)YH( class for the )SM(any)ES( +     wild)HY(card)YH(. They are described in the follow)HY(ing)YH( sub-sections. +  )EP( + + +  )0 3 54 H(2.12.1)WB 151 Sn()WB 58 Sn( Mapping for )SM(any)ES( with the One Cardi)HY(nal)HY(ity)YH( Class)EA()EH( + +  )0 P(For )SM(any)ES( with the One cardi)HY(nal)HY(ity)YH( class, +     there are no type defi)HY(ni)HY(tions)YH(. The acces)HY(sor)YH( func)HY(tions)YH( come in +     constant and non-constant versions. The constant acces)HY(sor)YH( func)HY(tion)YH( +     returns a constant refer)HY(ence)YH( to )SM(xercesc::DOMEle)HY(ment)YH()ES( and +     can be used for read-only access. The non-constant version returns +     an unre)HY(stricted)YH( refer)HY(ence)YH( to )SM(xercesc::DOMEle)HY(ment)YH()ES( and can +     be used for read-write access. +  )EP( + +  )0 P(The first modi)HY(fier)YH( func)HY(tion)YH( expects an argu)HY(ment)YH( of type refer)HY(ence)YH( +     to constant )SM(xercesc::DOMEle)HY(ment)YH()ES( and makes a deep copy +     of its argu)HY(ment)YH(. The second modi)HY(fier)YH( func)HY(tion)YH( expects an argu)HY(ment)YH( of +     type pointer to )SM(xercesc::DOMEle)HY(ment)YH()ES(. This modi)HY(fier)YH( +     func)HY(tion)YH( assumes owner)HY(ship)YH( of its argu)HY(ment)YH( and expects the element +     object to be created using the DOM docu)HY(ment)YH( asso)HY(ci)HY(ated)YH( with this +     instance. For example: +  )EP( + +  ) 5 30 PR(<complexType name="object"> +  <sequence> +    <any namespace="##other"/> +  </sequence> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 22 37 PR(class object: public xml_schema::type +{ +public: +  // Accessors. +  // +  const xercesc::DOMElement& +  any \201\202 const; + +  xercesc::DOMElement& +  any \201\202; + +  // Modifiers. +  // +  void +  any \201const xercesc::DOMElement&\202; + +  void +  any \201xercesc::DOMElement*\202; + +  ... + +};)RP( + + +  )0 P(The follow)HY(ing)YH( code shows how one could use this mapping:)EP( + +  ) 10 66 PR(void +f \201object& o, const xercesc::DOMElement& e\202 +{ +  using namespace xercesc; + +  DOMElement& e1 \201o.any \201\202\202;             // get +  o.any \201e\202                              // set, deep copy +  DOMDocument& doc \201o.dom_document \201\202\202; +  o.any \201doc.createElement \201...\202\202;       // set, assumes ownership +})RP( + +  )0 3 55 H(2.12.2)WB 152 Sn()WB 59 Sn( Mapping for )SM(any)ES( with the Optional Cardi)HY(nal)HY(ity)YH( Class)EA()EH( + +  )0 P(For )SM(any)ES( with the Optional cardi)HY(nal)HY(ity)YH( class, the type +     defi)HY(ni)HY(tions)YH( consist of an alias for the container type with name +     )SM(any_optional)ES( \201or )SM(any1_optional)ES(, etc., for +     subse)HY(quent)YH( wild)HY(cards)YH( in the type defi)HY(ni)HY(tion)YH(\202. +  )EP( + +  )0 P(Unlike acces)HY(sor)YH( func)HY(tions)YH( for the One cardi)HY(nal)HY(ity)YH( class, acces)HY(sor)YH( +     func)HY(tions)YH( for the Optional cardi)HY(nal)HY(ity)YH( class return refer)HY(ences)YH( to +     corre)HY(spond)HY(ing)YH( contain)HY(ers)YH( rather than directly to )SM(DOMEle)HY(ment)YH()ES(. +     The acces)HY(sor)YH( func)HY(tions)YH( come in constant and non-constant versions. +     The constant acces)HY(sor)YH( func)HY(tion)YH( returns a constant refer)HY(ence)YH( to +     the container and can be used for read-only access. The non-constant +     version returns an unre)HY(stricted)YH( refer)HY(ence)YH( to the container +     and can be used for read-write access. +  )EP( + +  )0 P(The modi)HY(fier)YH( func)HY(tions)YH( are over)HY(loaded)YH( for )SM(xercesc::DOMEle)HY(ment)YH()ES( +     and the container type. The first modi)HY(fier)YH( func)HY(tion)YH( expects an argu)HY(ment)YH( of +     type refer)HY(ence)YH( to constant )SM(xercesc::DOMEle)HY(ment)YH()ES( and +     makes a deep copy of its argu)HY(ment)YH(. The second modi)HY(fier)YH( func)HY(tion)YH( +     expects an argu)HY(ment)YH( of type pointer to )SM(xercesc::DOMEle)HY(ment)YH()ES(. +     This modi)HY(fier)YH( func)HY(tion)YH( assumes owner)HY(ship)YH( of its argu)HY(ment)YH( and expects +     the element object to be created using the DOM docu)HY(ment)YH( asso)HY(ci)HY(ated)YH( +     with this instance. The third modi)HY(fier)YH( func)HY(tion)YH( expects an argu)HY(ment)YH( +     of type refer)HY(ence)YH( to constant of the container type and makes a +     deep copy of its argu)HY(ment)YH(. For instance: +  )EP( + +  ) 5 44 PR(<complexType name="object"> +  <sequence> +    <any namespace="##other" minOccurs="0"/> +  </sequence> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 29 40 PR(class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef element_optional any_optional; + +  // Accessors. +  // +  const any_optional& +  any \201\202 const; + +  any_optional& +  any \201\202; + +  // Modifiers. +  // +  void +  any \201const xercesc::DOMElement&\202; + +  void +  any \201xercesc::DOMElement*\202; + +  void +  any \201const any_optional&\202; + +  ... + +};)RP( + + +  )0 P(The )SM(element_optional)ES( container is a +     special)HY(iza)HY(tion)YH( of the )SM(optional)ES( class template described +     in )0 49 1 A(Section 2.8.2, "Mapping for Members with the Optional +     Cardi)HY(nal)HY(ity)YH( Class")49 0 TN TL()Ec /AF f D(. Its inter)HY(face)YH( is presented below: +  )EP( + +  ) 72 71 PR(class element_optional +{ +public: +  explicit +  element_optional \201xercesc::DOMDocument&\202; + +  // Makes a deep copy. +  // +  element_optional \201const xercesc::DOMElement&, xercesc::DOMDocument&\202; + +  // Assumes ownership. +  // +  element_optional \201xercesc::DOMElement*, xercesc::DOMDocument&\202; + +  element_optional \201const element_optional&, xercesc::DOMDocument&\202; + +public: +  element_optional& +  operator= \201const xercesc::DOMElement&\202; + +  element_optional& +  operator= \201const element_optional&\202; + +  // Pointer-like interface. +  // +public: +  const xercesc::DOMElement* +  operator-> \201\202 const; + +  xercesc::DOMElement* +  operator-> \201\202;)WR( + +  const xercesc::DOMElement& +  operator* \201\202 const; + +  xercesc::DOMElement& +  operator* \201\202; + +  typedef void \201element_optional::*bool_convertible\202 \201\202; +  operator bool_convertible \201\202 const; + +  // Get/set interface. +  // +public: +  bool +  present \201\202 const; + +  const xercesc::DOMElement& +  get \201\202 const; + +  xercesc::DOMElement& +  get \201\202; + +  // Makes a deep copy. +  // +  void +  set \201const xercesc::DOMElement&\202; + +  // Assumes ownership. +  // +  void)WR( +  set \201xercesc::DOMElement*\202; + +  void +  reset \201\202; +}; + +bool +operator== \201const element_optional&, const element_optional&\202; + +bool +operator!= \201const element_optional&, const element_optional&\202;)RP( + + +  )0 P(The follow)HY(ing)YH( code shows how one could use this mapping:)EP( + +  ) 25 69 PR(void +f \201object& o, const xercesc::DOMElement& e\202 +{ +  using namespace xercesc; + +  DOMDocument& doc \201o.dom_document \201\202\202; + +  if \201o.any \201\202.present \201\202\202                  // test +  { +    DOMElement& e1 \201o.any \201\202.get \201\202\202;       // get +    o.any \201\202.set \201e\202;                       // set, deep copy +    o.any \201\202.set \201doc.createElement \201...\202\202; // set, assumes ownership +    o.any \201\202.reset \201\202;                      // reset +  } + +  // Same as above but using pointer notation: +  // +  if \201o.member \201\202\202                          // test +  { +    DOMElement& e1 \201*o.any \201\202\202;             // get +    o.any \201e\202;                              // set, deep copy +    o.any \201doc.createElement \201...\202\202;        // set, assumes ownership +    o.any \201\202.reset \201\202;                      // reset +  } +})RP( + + + +  )0 3 56 H(2.12.3)WB 153 Sn()WB 60 Sn( Mapping for )SM(any)ES( with the Sequence Cardi)HY(nal)HY(ity)YH( Class)EA()EH( + +  )0 P(For )SM(any)ES( with the Sequence cardi)HY(nal)HY(ity)YH( class, the type +     defi)HY(ni)HY(tions)YH( consist of an alias of the container type with name +     )SM(any_sequence)ES( \201or )SM(any1_sequence)ES(, etc., for +     subse)HY(quent)YH( wild)HY(cards)YH( in the type defi)HY(ni)HY(tion)YH(\202, an alias of the iter)HY(a)HY(tor)YH( +     type with name )SM(any_iter)HY(a)HY(tor)YH()ES( \201or )SM(any1_iter)HY(a)HY(tor)YH()ES(, +     etc., for subse)HY(quent)YH( wild)HY(cards)YH( in the type defi)HY(ni)HY(tion)YH(\202, and an alias +     of the constant iter)HY(a)HY(tor)YH( type with name )SM(any_const_iter)HY(a)HY(tor)YH()ES( +     \201or )SM(any1_const_iter)HY(a)HY(tor)YH()ES(, etc., for subse)HY(quent)YH( wild)HY(cards)YH( +     in the type defi)HY(ni)HY(tion)YH(\202. +  )EP( + +  )0 P(The acces)HY(sor)YH( func)HY(tions)YH( come in constant and non-constant versions. +     The constant acces)HY(sor)YH( func)HY(tion)YH( returns a constant refer)HY(ence)YH( to the +     container and can be used for read-only access. The non-constant +     version returns an unre)HY(stricted)YH( refer)HY(ence)YH( to the container and can +     be used for read-write access. +  )EP( + +  )0 P(The modi)HY(fier)YH( func)HY(tion)YH( expects an argu)HY(ment)YH( of type refer)HY(ence)YH( to +     constant of the container type. The modi)HY(fier)YH( func)HY(tion)YH( makes +     a deep copy of its argu)HY(ment)YH(. For instance: +  )EP( + + +  ) 5 52 PR(<complexType name="object"> +  <sequence> +    <any namespace="##other" minOccurs="unbounded"/> +  </sequence> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 25 58 PR(class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef element_sequence any_sequence; +  typedef any_sequence::iterator any_iterator; +  typedef any_sequence::const_iterator any_const_iterator; + +  // Accessors. +  // +  const any_sequence& +  any \201\202 const; + +  any_sequence& +  any \201\202; + +  // Modifier. +  // +  void +  any \201const any_sequence&\202; + +  ... + +};)RP( + +  )0 P(The )SM(element_sequence)ES( container is a +     special)HY(iza)HY(tion)YH( of the )SM(sequence)ES( class template described +     in )0 50 1 A(Section 2.8.3, "Mapping for Members with the +     Sequence Cardi)HY(nal)HY(ity)YH( Class")50 0 TN TL()Ec /AF f D(. Its inter)HY(face)YH( is similar to +     the sequence inter)HY(face)YH( as defined by the ISO/ANSI Stan)HY(dard)YH( for +     C++ \201ISO/IEC 14882:1998, Section 23.1.1, "Sequences"\202 and is +     presented below: +  )EP( + +  ) 178 70 PR(class element_sequence +{ +public: +  typedef xercesc::DOMElement        value_type; +  typedef xercesc::DOMElement*       pointer; +  typedef const xercesc::DOMElement* const_pointer; +  typedef xercesc::DOMElement&       reference; +  typedef const xercesc::DOMElement& const_reference; + +  typedef <implementation-defined>   iterator; +  typedef <implementation-defined>   const_iterator; +  typedef <implementation-defined>   reverse_iterator; +  typedef <implementation-defined>   const_reverse_iterator; + +  typedef <implementation-defined>   size_type; +  typedef <implementation-defined>   difference_type; +  typedef <implementation-defined>   allocator_type; + +public: +  explicit +  element_sequence \201xercesc::DOMDocument&\202; + +  // DOMElement cannot be default-constructed. +  // +  // explicit +  // element_sequence \201size_type n\202; + +  element_sequence \201size_type n, +                    const xercesc::DOMElement&, +                    xercesc::DOMDocument&\202; +)WR( +  template <typename I> +  element_sequence \201const I& begin, +                    const I& end, +                    xercesc::DOMDocument&\202; + +  element_sequence \201const element_sequence&, xercesc::DOMDocument&\202; + +  element_sequence& +  operator= \201const element_sequence&\202; + +public: +  void +  assign \201size_type n, const xercesc::DOMElement&\202; + +  template <typename I> +  void +  assign \201const I& begin, const I& end\202; + +public: +  // This version of resize can only be used to shrink the +  // sequence because DOMElement cannot be default-constructed. +  // +  void +  resize \201size_type\202; + +  void +  resize \201size_type, const xercesc::DOMElement&\202; + +public: +  size_type)WR( +  size \201\202 const; + +  size_type +  max_size \201\202 const; + +  size_type +  capacity \201\202 const; + +  bool +  empty \201\202 const; + +  void +  reserve \201size_type\202; + +  void +  clear \201\202; + +public: +  const_iterator +  begin \201\202 const; + +  const_iterator +  end \201\202 const; + +  iterator +  begin \201\202; + +  iterator +  end \201\202; +)WR( +  const_reverse_iterator +  rbegin \201\202 const; + +  const_reverse_iterator +  rend \201\202 const + +    reverse_iterator +  rbegin \201\202; + +  reverse_iterator +  rend \201\202; + +public: +  xercesc::DOMElement& +  operator[] \201size_type\202; + +  const xercesc::DOMElement& +  operator[] \201size_type\202 const; + +  xercesc::DOMElement& +  at \201size_type\202; + +  const xercesc::DOMElement& +  at \201size_type\202 const; + +  xercesc::DOMElement& +  front \201\202; + +  const xercesc::DOMElement& +  front \201\202 const;)WR( + +  xercesc::DOMElement& +  back \201\202; + +  const xercesc::DOMElement& +  back \201\202 const; + +public: +  // Makes a deep copy. +  // +  void +  push_back \201const xercesc::DOMElement&\202; + +  // Assumes ownership. +  // +  void +  push_back \201xercesc::DOMElement*\202; + +  void +  pop_back \201\202; + +  // Makes a deep copy. +  // +  iterator +  insert \201iterator position, const xercesc::DOMElement&\202; + +  // Assumes ownership. +  // +  iterator +  insert \201iterator position, xercesc::DOMElement*\202;)WR( + +  void +  insert \201iterator position, size_type n, const xercesc::DOMElement&\202; + +  template <typename I> +  void +  insert \201iterator position, const I& begin, const I& end\202; + +  iterator +  erase \201iterator position\202; + +  iterator +  erase \201iterator begin, iterator end\202; + +public: +  // Note that the DOMDocument object of the two sequences being +  // swapped should be the same. +  // +  void +  swap \201sequence& x\202; +}; + +inline bool +operator== \201const element_sequence&, const element_sequence&\202; + +inline bool +operator!= \201const element_sequence&, const element_sequence&\202;)RP( + + +  )0 P(The follow)HY(ing)YH( code shows how one could use this mapping:)EP( + +  ) 20 63 PR(void +f \201object& o, const xercesc::DOMElement& e\202 +{ +  using namespace xercesc; + +  object::any_sequence& s \201o.any \201\202\202; + +  // Iteration. +  // +  for \201object::any_iterator i \201s.begin \201\202\202; i != s.end \201\202; ++i\202 +  { +    DOMElement& e \201*i\202; +  } + +  // Modification. +  // +  s.push_back \201e\202;                       // deep copy +  DOMDocument& doc \201o.dom_document \201\202\202; +  s.push_back \201doc.createElement \201...\202\202; // assumes ownership +})RP( + +  )0 3 57 H(2.12.4)WB 154 Sn()WB 61 Sn( Element Wild)HY(card)YH( Order)EA()EH( + +  )0 P(Similar to elements, element wild)HY(cards)YH( in ordered types +     \201)0 51 1 A(Section 2.8.4, "Element Order")51 0 TN TL()Ec /AF f D(\202 are assigned +     content ids and are included in the content order sequence. +     Contin)HY(u)HY(ing)YH( with the bank trans)HY(ac)HY(tions)YH( example started in Section +     2.8.4, we can extend the batch by allow)HY(ing)YH( custom trans)HY(ac)HY(tions)YH(:)EP( + +  ) 7 52 PR(<complexType name="batch"> +  <choice minOccurs="0" maxOccurs="unbounded"> +    <element name="withdraw" type="withdraw"/> +    <element name="deposit" type="deposit"/> +    <any namespace="##other" processContents="lax"/> +  </choice> +</complexType>)RP( + +  )0 P(This will lead to the follow)HY(ing)YH( changes in the gener)HY(ated)YH( +     )SM(batch)ES( C++ class:)EP( + +  ) 24 58 PR(class batch: public xml_schema::type +{ +public: +  ... + +  // any +  // +  typedef element_sequence any_sequence; +  typedef any_sequence::iterator any_iterator; +  typedef any_sequence::const_iterator any_const_iterator; + +  static const std::size_t any_id = 3UL; + +  const any_sequence& +  any \201\202 const; + +  any_sequence& +  any \201\202; + +  void +  any \201const any_sequence&\202; + +  ... +};)RP( + +  )0 P(With this change we also need to update the iter)HY(a)HY(tion)YH( code to handle +     the new content id:)EP( + +  ) 18 73 PR(for \201batch::content_order_const_iterator i \201b.content_order \201\202.begin \201\202\202; +     i != b.content_order \201\202.end \201\202; +     ++i\202 +{ +  switch \201i->id\202 +  { +    ... + +  case batch::any_id: +    { +      const DOMElement& e \201b.any \201\202[i->index]\202; +      ... +      break; +    } + +    ... +  } +})RP( + +  )0 P(For the complete working code that shows the use of wild)HY(cards)YH( in +     ordered types refer to the )SM(order/element)ES( example in +     the )SM(exam)HY(ples)YH(/cxx/tree/)ES( direc)HY(tory)YH( in the XSD +     distri)HY(bu)HY(tion)YH(.)EP( + +  )0 3 58 H(2.12.5)WB 155 Sn()WB 62 Sn( Mapping for )SM(anyAt)HY(tribute)YH()ES()EA()EH( + +  )0 P(For )SM(anyAt)HY(tribute)YH()ES( the type defi)HY(ni)HY(tions)YH( consist of an alias +     of the container type with name )SM(any_attribute_set)ES( +     \201or )SM(any1_attribute_set)ES(, etc., for subse)HY(quent)YH( wild)HY(cards)YH( +     in the type defi)HY(ni)HY(tion)YH(\202, an alias of the iter)HY(a)HY(tor)YH( type with name +     )SM(any_attribute_iter)HY(a)HY(tor)YH()ES( \201or )SM(any1_attribute_iter)HY(a)HY(tor)YH()ES(, +     etc., for subse)HY(quent)YH( wild)HY(cards)YH( in the type defi)HY(ni)HY(tion)YH(\202, and an alias +     of the constant iter)HY(a)HY(tor)YH( type with name )SM(any_attribute_const_iter)HY(a)HY(tor)YH()ES( +     \201or )SM(any1_attribute_const_iter)HY(a)HY(tor)YH()ES(, etc., for subse)HY(quent)YH( +     wild)HY(cards)YH( in the type defi)HY(ni)HY(tion)YH(\202. +  )EP( + +  )0 P(The acces)HY(sor)YH( func)HY(tions)YH( come in constant and non-constant versions. +     The constant acces)HY(sor)YH( func)HY(tion)YH( returns a constant refer)HY(ence)YH( to the +     container and can be used for read-only access. The non-constant +     version returns an unre)HY(stricted)YH( refer)HY(ence)YH( to the container and can +     be used for read-write access. +  )EP( + +  )0 P(The modi)HY(fier)YH( func)HY(tion)YH( expects an argu)HY(ment)YH( of type refer)HY(ence)YH( to +     constant of the container type. The modi)HY(fier)YH( func)HY(tion)YH( makes +     a deep copy of its argu)HY(ment)YH(. For instance: +  )EP( + + +  ) 6 37 PR(<complexType name="object"> +  <sequence> +    ... +  </sequence> +  <anyAttribute namespace="##other"/> +</complexType>)RP( + +  )0 P(is mapped to:)EP( + +  ) 25 73 PR(class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef attribute_set any_attribute_set; +  typedef any_attribute_set::iterator any_attribute_iterator; +  typedef any_attribute_set::const_iterator any_attribute_const_iterator; + +  // Accessors. +  // +  const any_attribute_set& +  any_attribute \201\202 const; + +  any_attribute_set& +  any_attribute \201\202; + +  // Modifier. +  // +  void +  any_attribute \201const any_attribute_set&\202; + +  ... + +};)RP( + +  )0 P(The )SM(attribute_set)ES( class is an asso)HY(cia)HY(tive)YH( container +     similar to the )SM(std::set)ES( class template as defined by +     the ISO/ANSI Stan)HY(dard)YH( for C++ \201ISO/IEC 14882:1998, Section 23.3.3, +     "Class template set"\202 with the key being the attribute's name +     and names)HY(pace)YH(. Unlike )SM(std::set)ES(, )SM(attribute_set)ES( +     allows search)HY(ing)YH( using names and names)HY(paces)YH( instead of +     )SM(xercesc::DOMAttr)ES( objects. It is defined in an +     imple)HY(men)HY(ta)HY(tion)YH(-specific names)HY(pace)YH( and its inter)HY(face)YH( is presented +     below: +  )EP( + +  ) 166 70 PR(class attribute_set +{ +public: +  typedef xercesc::DOMAttr         key_type; +  typedef xercesc::DOMAttr         value_type; +  typedef xercesc::DOMAttr*        pointer; +  typedef const xercesc::DOMAttr*  const_pointer; +  typedef xercesc::DOMAttr&        reference; +  typedef const xercesc::DOMAttr&  const_reference; + +  typedef <implementation-defined> iterator; +  typedef <implementation-defined> const_iterator; +  typedef <implementation-defined> reverse_iterator; +  typedef <implementation-defined> const_reverse_iterator; + +  typedef <implementation-defined> size_type; +  typedef <implementation-defined> difference_type; +  typedef <implementation-defined> allocator_type; + +public: +  attribute_set \201xercesc::DOMDocument&\202; + +  template <typename I> +  attribute_set \201const I& begin, const I& end, xercesc::DOMDocument&\202; + +  attribute_set \201const attribute_set&, xercesc::DOMDocument&\202; + +  attribute_set& +  operator= \201const attribute_set&\202; + +public:)WR( +  const_iterator +  begin \201\202 const; + +  const_iterator +  end \201\202 const; + +  iterator +  begin \201\202; + +  iterator +  end \201\202; + +  const_reverse_iterator +  rbegin \201\202 const; + +  const_reverse_iterator +  rend \201\202 const; + +  reverse_iterator +  rbegin \201\202; + +  reverse_iterator +  rend \201\202; + +public: +  size_type +  size \201\202 const; + +  size_type +  max_size \201\202 const;)WR( + +  bool +  empty \201\202 const; + +  void +  clear \201\202; + +public: +  // Makes a deep copy. +  // +  std::pair<iterator, bool> +  insert \201const xercesc::DOMAttr&\202; + +  // Assumes ownership. +  // +  std::pair<iterator, bool> +  insert \201xercesc::DOMAttr*\202; + +  // Makes a deep copy. +  // +  iterator +  insert \201iterator position, const xercesc::DOMAttr&\202; + +  // Assumes ownership. +  // +  iterator +  insert \201iterator position, xercesc::DOMAttr*\202; + +  template <typename I> +  void)WR( +  insert \201const I& begin, const I& end\202; + +public: +  void +  erase \201iterator position\202; + +  size_type +  erase \201const std::basic_string<C>& name\202; + +  size_type +  erase \201const std::basic_string<C>& namespace_, +         const std::basic_string<C>& name\202; + +  size_type +  erase \201const XMLCh* name\202; + +  size_type +  erase \201const XMLCh* namespace_, const XMLCh* name\202; + +  void +  erase \201iterator begin, iterator end\202; + +public: +  size_type +  count \201const std::basic_string<C>& name\202 const; + +  size_type +  count \201const std::basic_string<C>& namespace_, +         const std::basic_string<C>& name\202 const; +)WR( +  size_type +  count \201const XMLCh* name\202 const; + +  size_type +  count \201const XMLCh* namespace_, const XMLCh* name\202 const; + +  iterator +  find \201const std::basic_string<C>& name\202; + +  iterator +  find \201const std::basic_string<C>& namespace_, +        const std::basic_string<C>& name\202; + +  iterator +  find \201const XMLCh* name\202; + +  iterator +  find \201const XMLCh* namespace_, const XMLCh* name\202; + +  const_iterator +  find \201const std::basic_string<C>& name\202 const; + +  const_iterator +  find \201const std::basic_string<C>& namespace_, +        const std::basic_string<C>& name\202 const; + +  const_iterator +  find \201const XMLCh* name\202 const; + +  const_iterator)WR( +  find \201const XMLCh* namespace_, const XMLCh* name\202 const; + +public: +  // Note that the DOMDocument object of the two sets being +  // swapped should be the same. +  // +  void +  swap \201attribute_set&\202; +}; + +bool +operator== \201const attribute_set&, const attribute_set&\202; + +bool +operator!= \201const attribute_set&, const attribute_set&\202;)RP( + +  )0 P(The follow)HY(ing)YH( code shows how one could use this mapping:)EP( + +  ) 25 73 PR(void +f \201object& o, const xercesc::DOMAttr& a\202 +{ +  using namespace xercesc; + +  object::any_attribute_set& s \201o.any_attribute \201\202\202; + +  // Iteration. +  // +  for \201object::any_attribute_iterator i \201s.begin \201\202\202; i != s.end \201\202; ++i\202 +  { +    DOMAttr& a \201*i\202; +  } + +  // Modification. +  // +  s.insert \201a\202;                         // deep copy +  DOMDocument& doc \201o.dom_document \201\202\202; +  s.insert \201doc.createAttribute \201...\202\202; // assumes ownership + +  // Searching. +  // +  object::any_attribute_iterator i \201s.find \201"name"\202\202; +  i = s.find \201"http://www.w3.org/XML/1998/namespace", "lang"\202; +})RP( + +   + +  )0 2 59 H(2.13)WB 156 Sn()WB 63 Sn( Mapping for Mixed Content Models)EA()EH( + +  )0 P(For XML Schema types with mixed content models C++/Tree provides +     mapping support only if the type is marked as ordered +     \201)0 51 1 A(Section 2.8.4, "Element Order")51 0 TN TL()Ec /AF f D(\202. Use the +     )SM(--ordered-type-mixed)ES( XSD compiler option to +     auto)HY(mat)HY(i)HY(cally)YH( mark all types with mixed content as ordered.)EP( + +  )0 P(For an ordered type with mixed content, C++/Tree adds an extra +     text content sequence that is used to store the text frag)HY(ments)YH(. +     This text content sequence is also assigned the content id and +     its entries are included in the content order sequence, just +     like elements. As a result, it is possi)HY(ble)YH( to capture the order +     between elements and text frag)HY(ments)YH(.)EP( + +  )0 P(As an example, consider the follow)HY(ing)YH( schema that describes text +     with embed)HY(ded)YH( links:)EP( + +  ) 13 73 PR(<complexType name="anchor"> +  <simpleContent> +    <extension base="string"> +      <attribute name="href" type="anyURI" use="required"/> +    </extension> +  </simpleContent> +</complexType> + +<complexType name="text" mixed="true"> +  <sequence> +    <element name="a" type="anchor" minOccurs="0" maxOccurs="unbounded"/> +  </sequence> +</complexType>)RP( + +  )0 P(The gener)HY(ated)YH( )SM(text)ES( C++ class will provide the follow)HY(ing)YH( +     API \201assum)HY(ing)YH( it is marked as ordered\202:)EP( + +  ) 57 78 PR(class text: public xml_schema::type +{ +public: +  // a +  // +  typedef anchor a_type; +  typedef sequence<a_type> a_sequence; +  typedef a_sequence::iterator a_iterator; +  typedef a_sequence::const_iterator a_const_iterator; + +  static const std::size_t a_id = 1UL; + +  const a_sequence& +  a \201\202 const; + +  a_sequence& +  a \201\202; + +  void +  a \201const a_sequence&\202; + +  // text_content +  // +  typedef xml_schema::string text_content_type; +  typedef sequence<text_content_type> text_content_sequence; +  typedef text_content_sequence::iterator text_content_iterator; +  typedef text_content_sequence::const_iterator text_content_const_iterator; + +  static const std::size_t text_content_id = 2UL; + +  const text_content_sequence&)WR( +  text_content \201\202 const; + +  text_content_sequence& +  text_content \201\202; + +  void +  text_content \201const text_content_sequence&\202; + +  // content_order +  // +  typedef xml_schema::content_order content_order_type; +  typedef std::vector<content_order_type> content_order_sequence; +  typedef content_order_sequence::iterator content_order_iterator; +  typedef content_order_sequence::const_iterator content_order_const_iterator; + +  const content_order_sequence& +  content_order \201\202 const; + +  content_order_sequence& +  content_order \201\202; + +  void +  content_order \201const content_order_sequence&\202; + +  ... +};)RP( + +  )0 P(Given this inter)HY(face)YH( we can iterate over both link elements +     and text in content order. The follow)HY(ing)YH( code frag)HY(ment)YH( converts +     our format to plain text with refer)HY(ences)YH(.)EP( + +  ) 26 72 PR(const text& t = ... + +for \201text::content_order_const_iterator i \201t.content_order \201\202.begin \201\202\202; +     i != t.content_order \201\202.end \201\202; +     ++i\202 +{ +  switch \201i->id\202 +  { +  case text::a_id: +    { +      const anchor& a \201t.a \201\202[i->index]\202; +      cerr << a << "[" << a.href \201\202 << "]"; +      break; +    } +  case text::text_content_id: +    { +      const xml_schema::string& s \201t.text_content \201\202[i->index]\202; +      cerr << s; +      break; +    } +  default: +    { +      assert \201false\202; // Unknown content id. +    } +  } +})RP( + +  )0 P(For the complete working code that shows the use of mixed content +     in ordered types refer to the )SM(order/mixed)ES( example in +     the )SM(exam)HY(ples)YH(/cxx/tree/)ES( direc)HY(tory)YH( in the XSD +     distri)HY(bu)HY(tion)YH(.)EP( + +   + + +  )0 1 60 H(3)WB 157 Sn()WB 64 Sn( Parsing)EA()EH( + +  )0 P(This chapter covers various aspects of parsing XML instance +     docu)HY(ments)YH( in order to obtain corre)HY(spond)HY(ing)YH( tree-like object +     model. +  )EP( + +  )0 P(Each global XML Schema element in the form:)EP( + +  ) 1 34 PR(<element name="name" type="type"/>)RP( + +  )0 P(is mapped to 14 over)HY(loaded)YH( C++ func)HY(tions)YH( in the form:)EP( + +  ) 96 65 PR(// Read from a URI or a local file. +// + +std::[auto|unique]_ptr<type> +name \201const std::basic_string<C>& uri, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + +std::[auto|unique]_ptr<type> +name \201const std::basic_string<C>& uri, +      xml_schema::error_handler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + +std::[auto|unique]_ptr<type> +name \201const std::basic_string<C>& uri, +      xercesc::DOMErrorHandler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + + +// Read from std::istream. +// + +std::[auto|unique]_ptr<type> +name \201std::istream&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + +std::[auto|unique]_ptr<type> +name \201std::istream&,)WR( +      xml_schema::error_handler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + +std::[auto|unique]_ptr<type> +name \201std::istream&, +      xercesc::DOMErrorHandler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + + +std::[auto|unique]_ptr<type> +name \201std::istream&, +      const std::basic_string<C>& id, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + +std::[auto|unique]_ptr<type> +name \201std::istream&, +      const std::basic_string<C>& id, +      xml_schema::error_handler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + +std::[auto|unique]_ptr<type> +name \201std::istream&, +      const std::basic_string<C>& id, +      xercesc::DOMErrorHandler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202;)WR( + + +// Read from InputSource. +// + +std::[auto|unique]_ptr<type> +name \201xercesc::InputSource&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + +std::[auto|unique]_ptr<type> +name \201xercesc::InputSource&, +      xml_schema::error_handler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + +std::[auto|unique]_ptr<type> +name \201xercesc::InputSource&, +      xercesc::DOMErrorHandler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202; + + +// Read from DOM. +// + +std::[auto|unique]_ptr<type> +name \201const xercesc::DOMDocument&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202;)WR( + +std::[auto|unique]_ptr<type> +name \201xml_schema::dom::[auto|unique]_ptr<xercesc::DOMDocument>, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties \201\202\202;)RP( + +  )0 P(You can choose between reading an XML instance from a local file, +     URI, )SM(std::istream)ES(, )SM(xercesc::Input)HY(Source)YH()ES(, +     or a pre-parsed DOM instance in the form of +     )SM(xercesc::DOMDoc)HY(u)HY(ment)YH()ES(. All the parsing func)HY(tions)YH( +     return a dynam)HY(i)HY(cally)YH( allo)HY(cated)YH( object model as either +     )SM(std::auto_ptr)ES( or )SM(std::unique_ptr)ES(, +     depend)HY(ing)YH( on the C++ stan)HY(dard)YH( selected. Each of these parsing +     func)HY(tions)YH( is discussed in more detail in the follow)HY(ing)YH( sections. +  )EP( + +  )0 2 61 H(3.1)WB 158 Sn()WB 65 Sn( Initial)HY(iz)HY(ing)YH( the Xerces-C++ Runtime)EA()EH( + +  )0 P(Some parsing func)HY(tions)YH( expect you to initial)HY(ize)YH( the Xerces-C++ +     runtime while others initial)HY(ize)YH( and termi)HY(nate)YH( it as part of their +     work. The general rule is as follows: if a func)HY(tion)YH( has any argu)HY(ments)YH( +     or return a value that is an instance of a Xerces-C++ type, then +     this func)HY(tion)YH( expects you to initial)HY(ize)YH( the Xerces-C++ runtime. +     Other)HY(wise)YH(, the func)HY(tion)YH( initial)HY(izes)YH( and termi)HY(nates)YH( the runtime for +     you. Note that it is legal to have nested calls to the Xerces-C++ +     initial)HY(ize)YH( and termi)HY(nate)YH( func)HY(tions)YH( as long as the calls are balanced. +  )EP( + +  )0 P(You can instruct parsing func)HY(tions)YH( that initial)HY(ize)YH( and termi)HY(nate)YH( +     the runtime not to do so by passing the +     )SM(xml_schema::flags::dont_initial)HY(ize)YH()ES( flag \201see +     )0 66 1 A(Section 3.2, "Flags and Prop)HY(er)HY(ties)YH(")66 0 TN TL()Ec /AF f D(\202. +  )EP( + + +  )0 2 62 H(3.2)WB 159 Sn()WB 66 Sn( Flags and Prop)HY(er)HY(ties)YH()EA()EH( + +  )0 P(Parsing flags and prop)HY(er)HY(ties)YH( are the last two argu)HY(ments)YH( of every +     parsing func)HY(tion)YH(. They allow you to fine-tune the process of +     instance vali)HY(da)HY(tion)YH( and parsing. Both argu)HY(ments)YH( are optional. +  )EP( + + +  )0 P(The follow)HY(ing)YH( flags are recog)HY(nized)YH( by the parsing func)HY(tions)YH(:)EP( + +  )0 DL(    )0 DT()SM(xml_schema::flags::keep_dom)ES( +    )DD(Keep asso)HY(ci)HY(a)HY(tion)YH( between DOM nodes and the result)HY(ing)YH( +        object model nodes. For more infor)HY(ma)HY(tion)YH( about DOM asso)HY(ci)HY(a)HY(tion)YH( +        refer to )0 93 1 A(Section 5.1, "DOM Asso)HY(ci)HY(a)HY(tion)YH(")93 0 TN TL()Ec /AF f D(. + +    )0 DT()SM(xml_schema::flags::own_dom)ES( +    )DD(Assume owner)HY(ship)YH( of the DOM docu)HY(ment)YH( passed. This flag only +        makes sense together with the )SM(keep_dom)ES( flag in +        the call to the parsing func)HY(tion)YH( with the +        )SM(xml_schema::dom::[auto|unique]_ptr<DOMDoc)HY(u)HY(ment)YH(>)ES( +        argu)HY(ment)YH(. + +    )0 DT()SM(xml_schema::flags::dont_vali)HY(date)YH()ES( +    )DD(Do not vali)HY(date)YH( instance docu)HY(ments)YH( against schemas. + +    )0 DT()SM(xml_schema::flags::dont_initial)HY(ize)YH()ES( +    )DD(Do not initial)HY(ize)YH( the Xerces-C++ runtime. +  )LD( + +  )0 P(You can pass several flags by combin)HY(ing)YH( them using the bit-wise OR +     oper)HY(a)HY(tor)YH(. For example:)EP( + +  ) 4 61 PR(using xml_schema::flags; + +std::auto_ptr<type> r \201 +  name \201"test.xml", flags::keep_dom | flags::dont_validate\202\202;)RP( + +  )0 P(By default, vali)HY(da)HY(tion)YH( of instance docu)HY(ments)YH( is turned on even +     though parsers gener)HY(ated)YH( by XSD do not assume instance +     docu)HY(ments)YH( are valid. They include a number of checks that prevent +     construc)HY(tion)YH( of incon)HY(sis)HY(tent)YH( object models. This, +     however, does not mean that an instance docu)HY(ment)YH( that was +     success)HY(fully)YH( parsed by the XSD-gener)HY(ated)YH( parsers is +     valid per the corre)HY(spond)HY(ing)YH( schema. If an instance docu)HY(ment)YH( is not +     "valid enough" for the gener)HY(ated)YH( parsers to construct consis)HY(tent)YH( +     object model, one of the excep)HY(tions)YH( defined in +     )SM(xml_schema)ES( names)HY(pace)YH( is thrown \201see +     )0 67 1 A(Section 3.3, "Error Handling")67 0 TN TL()Ec /AF f D(\202. +  )EP( + +  )0 P(For more infor)HY(ma)HY(tion)YH( on the Xerces-C++ runtime initial)HY(iza)HY(tion)YH( +     refer to )0 65 1 A(Section 3.1, "Initial)HY(iz)HY(ing)YH( the Xerces-C++ +     Runtime")65 0 TN TL()Ec /AF f D(. +  )EP( + +  )0 P(The )SM(xml_schema::prop)HY(er)HY(ties)YH()ES( class allows you to +     program)HY(mat)HY(i)HY(cally)YH( specify schema loca)HY(tions)YH( to be used instead +     of those spec)HY(i)HY(fied)YH( with the )SM(xsi::schemaLo)HY(ca)HY(tion)YH()ES( +     and )SM(xsi::noNames)HY(paceSchemaLo)HY(ca)HY(tion)YH()ES( attributes +     in instance docu)HY(ments)YH(. The inter)HY(face)YH( of the )SM(prop)HY(er)HY(ties)YH()ES( +     class is presented below: +  )EP( + +  ) 9 70 PR(class properties +{ +public: +  void +  schema_location \201const std::basic_string<C>& namespace_, +                   const std::basic_string<C>& location\202; +  void +  no_namespace_schema_location \201const std::basic_string<C>& location\202; +};)RP( + +  )0 P(Note that all loca)HY(tions)YH( are rela)HY(tive)YH( to an instance docu)HY(ment)YH( unless +     they are URIs. For example, if you want to use a local file as your +     schema, then you will need to pass +     )SM(file:///abso)HY(lute)YH(/path/to/your/schema)ES( as the loca)HY(tion)YH( +     argu)HY(ment)YH(. +  )EP( + +  )0 2 63 H(3.3)WB 160 Sn()WB 67 Sn( Error Handling)EA()EH( + +  )0 P(As discussed in )0 14 1 A(Section 2.2, "Error Handling")14 0 TN TL()Ec /AF f D(, +     the mapping uses the C++ excep)HY(tion)YH( handling mech)HY(a)HY(nism)YH( as its primary +     way of report)HY(ing)YH( error condi)HY(tions)YH(. However, to handle recov)HY(er)HY(able)YH( +     parsing and vali)HY(da)HY(tion)YH( errors and warn)HY(ings)YH(, a call)HY(back)YH( inter)HY(face)YH( maybe +     preferred by the appli)HY(ca)HY(tion)YH(.)EP( + +  )0 P(To better under)HY(stand)YH( error handling and report)HY(ing)YH( strate)HY(gies)YH( employed +     by the parsing func)HY(tions)YH(, it is useful to know that the +     trans)HY(for)HY(ma)HY(tion)YH( of an XML instance docu)HY(ment)YH( to a stat)HY(i)HY(cally)YH(-typed +     tree happens in two stages. The first stage, performed by Xerces-C++, +     consists of parsing an XML docu)HY(ment)YH( into a DOM instance. For short, +     we will call this stage the XML-DOM stage. Vali)HY(da)HY(tion)YH(, if not disabled, +     happens during this stage. The second stage, +     performed by the gener)HY(ated)YH( parsers, consist of parsing the DOM +     instance into the stat)HY(i)HY(cally)YH(-typed tree. We will call this stage +     the DOM-Tree stage. Addi)HY(tional)YH( checks are performed during this +     stage in order to prevent construc)HY(tion)YH( of incon)HY(sis)HY(tent)YH( tree which +     could other)HY(wise)YH( happen when vali)HY(da)HY(tion)YH( is disabled, for example.)EP( + +  )0 P(All parsing func)HY(tions)YH( except the one that oper)HY(ates)YH( on a DOM instance +     come in over)HY(loaded)YH( triples. The first func)HY(tion)YH( in such a triple +     reports error condi)HY(tions)YH( exclu)HY(sively)YH( by throw)HY(ing)YH( excep)HY(tions)YH(. It +     accu)HY(mu)HY(lates)YH( all the parsing and vali)HY(da)HY(tion)YH( errors of the XML-DOM +     stage and throws them in a single instance of the +     )SM(xml_schema::parsing)ES( excep)HY(tion)YH( \201described below\202. +     The second and the third func)HY(tions)YH( in the triple use call)HY(back)YH( +     inter)HY(faces)YH( to report parsing and vali)HY(da)HY(tion)YH( errors and warn)HY(ings)YH(. +     The two call)HY(back)YH( inter)HY(faces)YH( are )SM(xml_schema::error_handler)ES( +     and )SM(xercesc::DOMEr)HY(rorHan)HY(dler)YH()ES(. For more infor)HY(ma)HY(tion)YH( +     on the )SM(xercesc::DOMEr)HY(rorHan)HY(dler)YH()ES( inter)HY(face)YH( refer to +     the Xerces-C++ docu)HY(men)HY(ta)HY(tion)YH(. The )SM(xml_schema::error_handler)ES( +     inter)HY(face)YH( is presented below: +  )EP( + +  ) 23 51 PR(class error_handler +{ +public: +  struct severity +  { +    enum value +    { +      warning, +      error, +      fatal +    }; +  }; + +  virtual bool +  handle \201const std::basic_string<C>& id, +          unsigned long line, +          unsigned long column, +          severity, +          const std::basic_string<C>& message\202 = 0; + +  virtual +  ~error_handler \201\202; +};)RP( + +  )0 P(The )SM(id)ES( argu)HY(ment)YH( of the )SM(error_handler::handle)ES( +     func)HY(tion)YH( iden)HY(ti)HY(fies)YH( the resource being parsed \201e.g., a file name or +     URI\202. +  )EP( + +  )0 P(By return)HY(ing)YH( )SM(true)ES( from the )SM(handle)ES( func)HY(tion)YH( +     you instruct the parser to recover and continue parsing. Return)HY(ing)YH( +     )SM(false)ES( results in termi)HY(na)HY(tion)YH( of the parsing process. +     An error with the )SM(fatal)ES( sever)HY(ity)YH( level results in +     termi)HY(na)HY(tion)YH( of the parsing process no matter what is returned from +     the )SM(handle)ES( func)HY(tion)YH(. It is safe to throw an excep)HY(tion)YH( +     from the )SM(handle)ES( func)HY(tion)YH(. +  )EP( + +  )0 P(The DOM-Tree stage reports error condi)HY(tions)YH( exclu)HY(sively)YH( by throw)HY(ing)YH( +     excep)HY(tions)YH(. Indi)HY(vid)HY(ual)YH( excep)HY(tions)YH( thrown by the parsing func)HY(tions)YH( +     are described in the follow)HY(ing)YH( sub-sections. +  )EP( + + +  )0 3 64 H(3.3.1)WB 161 Sn()WB 68 Sn( )SM(xml_schema::parsing)ES()EA()EH( + +  ) 57 56 PR(struct severity +{ +  enum value +  { +    warning, +    error +  }; + +  severity \201value\202; +  operator value \201\202 const; +}; + +struct error +{ +  error \201severity, +         const std::basic_string<C>& id, +         unsigned long line, +         unsigned long column, +         const std::basic_string<C>& message\202; + +  severity +  severity \201\202 const; + +  const std::basic_string<C>& +  id \201\202 const; + +  unsigned long +  line \201\202 const; + +  unsigned long +  column \201\202 const;)WR( + +  const std::basic_string<C>& +  message \201\202 const; +}; + +std::basic_ostream<C>& +operator<< \201std::basic_ostream<C>&, const error&\202; + +struct diagnostics: std::vector<error> +{ +}; + +std::basic_ostream<C>& +operator<< \201std::basic_ostream<C>&, const diagnostics&\202; + +struct parsing: virtual exception +{ +  parsing \201\202; +  parsing \201const diagnostics&\202; + +  const diagnostics& +  diagnostics \201\202 const; + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::parsing)ES( excep)HY(tion)YH( is thrown if there +     were parsing or vali)HY(da)HY(tion)YH( errors reported during the XML-DOM stage. +     If no call)HY(back)YH( inter)HY(face)YH( was provided to the parsing func)HY(tion)YH(, the +     excep)HY(tion)YH( contains a list of errors and warn)HY(ings)YH( acces)HY(si)HY(ble)YH( using +     the )SM(diag)HY(nos)HY(tics)YH()ES( func)HY(tion)YH(. The usual condi)HY(tions)YH( when +     this excep)HY(tion)YH( is thrown include malformed XML instances and, if +     vali)HY(da)HY(tion)YH( is turned on, invalid instance docu)HY(ments)YH(. +  )EP( + +  )0 3 65 H(3.3.2)WB 162 Sn()WB 69 Sn( )SM(xml_schema::expected_element)ES()EA()EH( + +  ) 16 60 PR(struct expected_element: virtual exception +{ +  expected_element \201const std::basic_string<C>& name, +                    const std::basic_string<C>& namespace_\202; + + +  const std::basic_string<C>& +  name \201\202 const; + +  const std::basic_string<C>& +  namespace_ \201\202 const; + + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::expected_element)ES( excep)HY(tion)YH( is thrown +     when an expected element is not encoun)HY(tered)YH( by the DOM-Tree stage. +     The name and names)HY(pace)YH( of the expected element can be obtained using +     the )SM(name)ES( and )SM(names)HY(pace)YH(_)ES( func)HY(tions)YH( respec)HY(tively)YH(. +  )EP( + + +  )0 3 66 H(3.3.3)WB 163 Sn()WB 70 Sn( )SM(xml_schema::unex)HY(pected)YH(_element)ES()EA()EH( + +  ) 25 72 PR(struct unexpected_element: virtual exception +{ +  unexpected_element \201const std::basic_string<C>& encountered_name, +                      const std::basic_string<C>& encountered_namespace, +                      const std::basic_string<C>& expected_name, +                      const std::basic_string<C>& expected_namespace\202 + + +  const std::basic_string<C>& +  encountered_name \201\202 const; + +  const std::basic_string<C>& +  encountered_namespace \201\202 const; + + +  const std::basic_string<C>& +  expected_name \201\202 const; + +  const std::basic_string<C>& +  expected_namespace \201\202 const; + + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::unex)HY(pected)YH(_element)ES( excep)HY(tion)YH( is thrown +     when an unex)HY(pected)YH( element is encoun)HY(tered)YH( by the DOM-Tree stage. +     The name and names)HY(pace)YH( of the encoun)HY(tered)YH( element can be obtained +     using the )SM(encoun)HY(tered)YH(_name)ES( and +     )SM(encoun)HY(tered)YH(_names)HY(pace)YH()ES( func)HY(tions)YH( respec)HY(tively)YH(. If an +     element was expected instead of the encoun)HY(tered)YH( one, its name +     and names)HY(pace)YH( can be obtained using the )SM(expected_name)ES( and +     )SM(expected_names)HY(pace)YH()ES( func)HY(tions)YH( respec)HY(tively)YH(. Other)HY(wise)YH( +     these func)HY(tions)YH( return empty strings. +  )EP( + +  )0 3 67 H(3.3.4)WB 164 Sn()WB 71 Sn( )SM(xml_schema::expected_attribute)ES()EA()EH( + +  ) 16 62 PR(struct expected_attribute: virtual exception +{ +  expected_attribute \201const std::basic_string<C>& name, +                      const std::basic_string<C>& namespace_\202; + + +  const std::basic_string<C>& +  name \201\202 const; + +  const std::basic_string<C>& +  namespace_ \201\202 const; + + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::expected_attribute)ES( excep)HY(tion)YH( is thrown +     when an expected attribute is not encoun)HY(tered)YH( by the DOM-Tree stage. +     The name and names)HY(pace)YH( of the expected attribute can be obtained using +     the )SM(name)ES( and )SM(names)HY(pace)YH(_)ES( func)HY(tions)YH( respec)HY(tively)YH(. +  )EP( + + +  )0 3 68 H(3.3.5)WB 165 Sn()WB 72 Sn( )SM(xml_schema::unex)HY(pected)YH(_enumer)HY(a)HY(tor)YH()ES()EA()EH( + +  ) 10 65 PR(struct unexpected_enumerator: virtual exception +{ +  unexpected_enumerator \201const std::basic_string<C>& enumerator\202; + +  const std::basic_string<C>& +  enumerator \201\202 const; + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::unex)HY(pected)YH(_enumer)HY(a)HY(tor)YH()ES( excep)HY(tion)YH( is thrown +     when an unex)HY(pected)YH( enumer)HY(a)HY(tor)YH( is encoun)HY(tered)YH( by the DOM-Tree stage. +     The enumer)HY(a)HY(tor)YH( can be obtained using the )SM(enumer)HY(a)HY(tor)YH()ES( +     func)HY(tions)YH(. +  )EP( + +  )0 3 69 H(3.3.6)WB 166 Sn()WB 73 Sn( )SM(xml_schema::expected_text_content)ES()EA()EH( + +  ) 5 47 PR(struct expected_text_content: virtual exception +{ +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::expected_text_content)ES( excep)HY(tion)YH( is thrown +     when a content other than text is encoun)HY(tered)YH( and the text content was +     expected by the DOM-Tree stage. +  )EP( + +  )0 3 70 H(3.3.7)WB 167 Sn()WB 74 Sn( )SM(xml_schema::no_type_info)ES()EA()EH( + +  ) 14 60 PR(struct no_type_info: virtual exception +{ +  no_type_info \201const std::basic_string<C>& type_name, +                const std::basic_string<C>& type_namespace\202; + +  const std::basic_string<C>& +  type_name \201\202 const; + +  const std::basic_string<C>& +  type_namespace \201\202 const; + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::no_type_info)ES( excep)HY(tion)YH( is thrown +     when there is no type infor)HY(ma)HY(tion)YH( asso)HY(ci)HY(ated)YH( with a type spec)HY(i)HY(fied)YH( +     by the )SM(xsi:type)ES( attribute. This excep)HY(tion)YH( is thrown +     by the DOM-Tree stage. The name and names)HY(pace)YH( of the type in ques)HY(tion)YH( +     can be obtained using the )SM(type_name)ES( and +     )SM(type_names)HY(pace)YH()ES( func)HY(tions)YH( respec)HY(tively)YH(. Usually, catch)HY(ing)YH( +     this excep)HY(tion)YH( means that you haven't linked the code gener)HY(ated)YH( +     from the schema defin)HY(ing)YH( the type in ques)HY(tion)YH( with your appli)HY(ca)HY(tion)YH( +     or this schema has been compiled without the +     )SM(--gener)HY(ate)YH(-poly)HY(mor)HY(phic)YH()ES( option. +  )EP( + + +  )0 3 71 H(3.3.8)WB 168 Sn()WB 75 Sn( )SM(xml_schema::not_derived)ES()EA()EH( + +  ) 23 67 PR(struct not_derived: virtual exception +{ +  not_derived \201const std::basic_string<C>& base_type_name, +               const std::basic_string<C>& base_type_namespace, +               const std::basic_string<C>& derived_type_name, +               const std::basic_string<C>& derived_type_namespace\202; + +  const std::basic_string<C>& +  base_type_name \201\202 const; + +  const std::basic_string<C>& +  base_type_namespace \201\202 const; + + +  const std::basic_string<C>& +  derived_type_name \201\202 const; + +  const std::basic_string<C>& +  derived_type_namespace \201\202 const; + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::not_derived)ES( excep)HY(tion)YH( is thrown +     when a type spec)HY(i)HY(fied)YH( by the )SM(xsi:type)ES( attribute is +     not derived from the expected base type. This excep)HY(tion)YH( is thrown +     by the DOM-Tree stage. The name and names)HY(pace)YH( of the expected +     base type can be obtained using the )SM(base_type_name)ES( and +     )SM(base_type_names)HY(pace)YH()ES( func)HY(tions)YH( respec)HY(tively)YH(. The name +     and names)HY(pace)YH( of the offend)HY(ing)YH( type can be obtained using the +     )SM(derived_type_name)ES( and +     )SM(derived_type_names)HY(pace)YH()ES( func)HY(tions)YH( respec)HY(tively)YH(. +  )EP( + +  )0 3 72 H(3.3.9)WB 169 Sn()WB 76 Sn( )SM(xml_schema::no_prefix_mapping)ES()EA()EH( + +  ) 10 57 PR(struct no_prefix_mapping: virtual exception +{ +  no_prefix_mapping \201const std::basic_string<C>& prefix\202; + +  const std::basic_string<C>& +  prefix \201\202 const; + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::no_prefix_mapping)ES( excep)HY(tion)YH( is thrown +     during the DOM-Tree stage if a names)HY(pace)YH( prefix is encoun)HY(tered)YH( for +     which a prefix-names)HY(pace)YH( mapping hasn't been provided. The names)HY(pace)YH( +     prefix in ques)HY(tion)YH( can be obtained using the )SM(prefix)ES( +     func)HY(tion)YH(. +  )EP( + +  )0 2 73 H(3.4)WB 170 Sn()WB 77 Sn( Reading from a Local File or URI)EA()EH( + +  )0 P(Using a local file or URI is the simplest way to parse an XML instance. +     For example:)EP( + +  ) 4 67 PR(using std::auto_ptr; + +auto_ptr<type> r1 \201name \201"test.xml"\202\202; +auto_ptr<type> r2 \201name \201"http://www.codesynthesis.com/test.xml"\202\202;)RP( + +  )0 P(Or, in the C++11 mode:)EP( + +  ) 4 69 PR(using std::unique_ptr; + +unique_ptr<type> r1 \201name \201"test.xml"\202\202; +unique_ptr<type> r2 \201name \201"http://www.codesynthesis.com/test.xml"\202\202;)RP( + +  )0 2 74 H(3.5)WB 171 Sn()WB 78 Sn( Reading from )SM(std::istream)ES()EA()EH( + +  )0 P(When using an )SM(std::istream)ES( instance, you may also +     pass an optional resource id. This id is used to iden)HY(tify)YH( the +     resource \201for example in error messages\202 as well as to resolve +     rela)HY(tive)YH( paths. For instance:)EP( + +  ) 12 48 PR(using std::auto_ptr; + +{ +  std::ifstream ifs \201"test.xml"\202; +  auto_ptr<type> r \201name \201ifs, "test.xml"\202\202; +} + +{ +  std::string str \201"..."\202; // Some XML fragment. +  std::istringstream iss \201str\202; +  auto_ptr<type> r \201name \201iss\202\202; +})RP( + +  )0 2 75 H(3.6)WB 172 Sn()WB 79 Sn( Reading from )SM(xercesc::Input)HY(Source)YH()ES()EA()EH( + +  )0 P(Reading from a )SM(xercesc::Input)HY(Source)YH()ES( instance +     is similar to the )SM(std::istream)ES( case except +     the resource id is main)HY(tained)YH( by the )SM(Input)HY(Source)YH()ES( +     object. For instance:)EP( + +  ) 2 34 PR(xercesc::StdInInputSource is; +std::auto_ptr<type> r \201name \201is\202\202;)RP( + +  )0 2 76 H(3.7)WB 173 Sn()WB 80 Sn( Reading from DOM)EA()EH( + +  )0 P(Reading from a )SM(xercesc::DOMDoc)HY(u)HY(ment)YH()ES( instance allows +     you to setup a custom XML-DOM stage. Things like DOM +     parser reuse, schema pre-parsing, and schema caching can be achieved +     with this approach. For more infor)HY(ma)HY(tion)YH( on how to obtain DOM +     repre)HY(sen)HY(ta)HY(tion)YH( from an XML instance refer to the Xerces-C++ +     docu)HY(men)HY(ta)HY(tion)YH(. In addi)HY(tion)YH(, the +     )R7 2 A(C++/Tree Mapping +     FAQ)EA( shows how to parse an XML instance to a Xerces-C++ +     DOM docu)HY(ment)YH( using the XSD runtime util)HY(i)HY(ties)YH(. +  )EP( + +  )0 P(The last parsing func)HY(tion)YH( is useful when you would like to perform +     your own XML-to-DOM parsing and as)HY(so)HY(ciate)YH( the result)HY(ing)YH( DOM docu)HY(ment)YH( +     with the object model nodes. The auto)HY(matic)YH( )SM(DOMDoc)HY(u)HY(ment)YH()ES( +     pointer is reset and the result)HY(ing)YH( object model assumes owner)HY(ship)YH( +     of the DOM docu)HY(ment)YH( passed. For example:)EP( + +  ) 18 72 PR(// C++98 version. +// +xml_schema::dom::auto_ptr<xercesc::DOMDocument> doc = ... + +std::auto_ptr<type> r \201 +  name \201doc, xml_schema::flags::keep_dom | xml_schema::flags::own_dom\202\202; + +// At this point doc is reset to 0. + +// C++11 version. +// +xml_schema::dom::unique_ptr<xercesc::DOMDocument> doc = ... + +std::unique_ptr<type> r \201 +  name \201std::move \201doc\202, +        xml_schema::flags::keep_dom | xml_schema::flags::own_dom\202\202; + +// At this point doc is reset to 0.)RP( + +  )0 1 77 H(4)WB 174 Sn()WB 81 Sn( Seri)HY(al)HY(iza)HY(tion)YH()EA()EH( + +  )0 P(This chapter covers various aspects of seri)HY(al)HY(iz)HY(ing)YH( a +     tree-like object model to DOM or XML. +     In this regard, seri)HY(al)HY(iza)HY(tion)YH( is compli)HY(men)HY(tary)YH( to the reverse +     process of parsing a DOM or XML instance into an object model +     which is discussed in )0 64 1 A(Chapter 3, +     "Parsing")64 0 TN TL()Ec /AF f D(. Note that the gener)HY(a)HY(tion)YH( of the seri)HY(al)HY(iza)HY(tion)YH( code +     is optional and should be explic)HY(itly)YH( requested with the +     )SM(--gener)HY(ate)YH(-seri)HY(al)HY(iza)HY(tion)YH()ES( option. See the +     )R8 2 A(XSD +     Compiler Command Line Manual)EA( for more infor)HY(ma)HY(tion)YH(. +  )EP( + +  )0 P(Each global XML Schema element in the form: +  )EP( + + +  ) 1 38 PR(<xsd:element name="name" type="type"/>)RP( + +  )0 P(is mapped to 8 over)HY(loaded)YH( C++ func)HY(tions)YH( in the form:)EP( + +  ) 70 56 PR(// Serialize to std::ostream. +// +void +name \201std::ostream&, +      const type&, +      const xml_schema::namespace_fomap& = +        xml_schema::namespace_infomap \201\202, +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0\202; + +void +name \201std::ostream&, +      const type&, +      xml_schema::error_handler&, +      const xml_schema::namespace_infomap& = +        xml_schema::namespace_infomap \201\202, +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0\202; + +void +name \201std::ostream&, +      const type&, +      xercesc::DOMErrorHandler&, +      const xml_schema::namespace_infomap& = +        xml_schema::namespace_infomap \201\202, +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0\202; + + +// Serialize to XMLFormatTarget. +//)WR( +void +name \201xercesc::XMLFormatTarget&, +      const type&, +      const xml_schema::namespace_infomap& = +        xml_schema::namespace_infomap \201\202, +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0\202; + +void +name \201xercesc::XMLFormatTarget&, +      const type&, +      xml_schema::error_handler&, +      const xml_schema::namespace_infomap& = +        xml_schema::namespace_infomap \201\202, +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0\202; + +void +name \201xercesc::XMLFormatTarget&, +      const type&, +      xercesc::DOMErrorHandler&, +      const xml_schema::namespace_infomap& = +        xml_schema::namespace_infomap \201\202, +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0\202; + + +// Serialize to DOM. +// +xml_schema::dom::[auto|unique]_ptr<xercesc::DOMDocument>)WR( +name \201const type&, +      const xml_schema::namespace_infomap& +        xml_schema::namespace_infomap \201\202, +      xml_schema::flags = 0\202; + +void +name \201xercesc::DOMDocument&, +      const type&, +      xml_schema::flags = 0\202;)RP( + +  )0 P(You can choose between writing XML to )SM(std::ostream)ES( or +     )SM(xercesc::XMLFor)HY(mat)HY(Tar)HY(get)YH()ES( and creat)HY(ing)YH( a DOM instance +     in the form of )SM(xercesc::DOMDoc)HY(u)HY(ment)YH()ES(. Seri)HY(al)HY(iza)HY(tion)YH( +     to )SM(ostream)ES( or )SM(XMLFor)HY(mat)HY(Tar)HY(get)YH()ES( requires a +     consid)HY(er)HY(ably)YH( less work while seri)HY(al)HY(iza)HY(tion)YH( to DOM provides +     for greater flex)HY(i)HY(bil)HY(ity)YH(. Each of these seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( +     is discussed in more detail in the follow)HY(ing)YH( sections. +  )EP( + + +  )0 2 78 H(4.1)WB 175 Sn()WB 82 Sn( Initial)HY(iz)HY(ing)YH( the Xerces-C++ Runtime)EA()EH( + +  )0 P(Some seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( expect you to initial)HY(ize)YH( the Xerces-C++ +     runtime while others initial)HY(ize)YH( and termi)HY(nate)YH( it as part of their +     work. The general rule is as follows: if a func)HY(tion)YH( has any argu)HY(ments)YH( +     or return a value that is an instance of a Xerces-C++ type, then +     this func)HY(tion)YH( expects you to initial)HY(ize)YH( the Xerces-C++ runtime. +     Other)HY(wise)YH(, the func)HY(tion)YH( initial)HY(izes)YH( and termi)HY(nates)YH( the runtime for +     you. Note that it is legal to have nested calls to the Xerces-C++ +     initial)HY(ize)YH( and termi)HY(nate)YH( func)HY(tions)YH( as long as the calls are balanced. +  )EP( + +  )0 P(You can instruct seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( that initial)HY(ize)YH( and termi)HY(nate)YH( +     the runtime not to do so by passing the +     )SM(xml_schema::flags::dont_initial)HY(ize)YH()ES( flag \201see +     )0 84 1 A(Section 4.3, "Flags")84 0 TN TL()Ec /AF f D(\202. +  )EP( + +  )0 2 79 H(4.2)WB 176 Sn()WB 83 Sn( Names)HY(pace)YH( Infomap and Char)HY(ac)HY(ter)YH( Encod)HY(ing)YH()EA()EH( + +  )0 P(When a docu)HY(ment)YH( being seri)HY(al)HY(ized)YH( uses XML names)HY(paces)YH(, custom +     prefix-names)HY(pace)YH( asso)HY(ci)HY(a)HY(tions)YH( can to be estab)HY(lished)YH(. If custom +     prefix-names)HY(pace)YH( mapping is not provided then generic prefixes +     \201)SM(p1)ES(, )SM(p2)ES(, etc\202 are auto)HY(mat)HY(i)HY(cally)YH( assigned +     to names)HY(paces)YH( as needed. Also, if +     you would like the result)HY(ing)YH( instance docu)HY(ment)YH( to contain the +     )SM(schemaLo)HY(ca)HY(tion)YH()ES( or )SM(noNames)HY(paceSchemaLo)HY(ca)HY(tion)YH()ES( +     attributes, you will need to provide names)HY(pace)YH(-schema asso)HY(ci)HY(a)HY(tions)YH(. +     The )SM(xml_schema::names)HY(pace)YH(_infomap)ES( class is used +     to capture this infor)HY(ma)HY(tion)YH(:)EP( + +  ) 16 63 PR(struct namespace_info +{ +  namespace_info \201\202; +  namespace_info \201const std::basic_string<C>& name, +                  const std::basic_string<C>& schema\202; + +  std::basic_string<C> name; +  std::basic_string<C> schema; +}; + +// Map of namespace prefix to namespace_info. +// +struct namespace_infomap: public std::map<std::basic_string<C>, +                                          namespace_info> +{ +};)RP( + +  )0 P(Consider the follow)HY(ing)YH( asso)HY(ci)HY(a)HY(tions)YH( as an example:)EP( + +  ) 4 52 PR(xml_schema::namespace_infomap map; + +map["t"].name = "http://www.codesynthesis.com/test"; +map["t"].schema = "test.xsd";)RP( + +  )0 P(This map, if passed to one of the seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH(, +     could result in the follow)HY(ing)YH( XML frag)HY(ment)YH(:)EP( + +  ) 4 72 PR(<?xml version="1.0" ?> +<t:name xmlns:t="http://www.codesynthesis.com/test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="http://www.codesynthesis.com/test test.xsd">)RP( + +  )0 P(As you can see, the seri)HY(al)HY(iza)HY(tion)YH( func)HY(tion)YH( auto)HY(mat)HY(i)HY(cally)YH( added names)HY(pace)YH( +     mapping for the )SM(xsi)ES( prefix. You can change this by +     provid)HY(ing)YH( your own prefix:)EP( + +  ) 6 62 PR(xml_schema::namespace_infomap map; + +map["xsn"].name = "http://www.w3.org/2001/XMLSchema-instance"; + +map["t"].name = "http://www.codesynthesis.com/test"; +map["t"].schema = "test.xsd";)RP( + +  )0 P(This could result in the follow)HY(ing)YH( XML frag)HY(ment)YH(:)EP( + +  ) 4 72 PR(<?xml version="1.0" ?> +<t:name xmlns:t="http://www.codesynthesis.com/test" +        xmlns:xsn="http://www.w3.org/2001/XMLSchema-instance" +        xsn:schemaLocation="http://www.codesynthesis.com/test test.xsd">)RP( + +  )0 P(To specify the loca)HY(tion)YH( of a schema without a names)HY(pace)YH( you can use +     an empty prefix as in the example below: )EP( + +  ) 3 34 PR(xml_schema::namespace_infomap map; + +map[""].schema = "test.xsd";)RP( + +  )0 P(This would result in the follow)HY(ing)YH( XML frag)HY(ment)YH(:)EP( + +  ) 3 59 PR(<?xml version="1.0" ?> +<name xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +      xsi:noNamespaceSchemaLocation="test.xsd">)RP( + +  )0 P(To make a partic)HY(u)HY(lar)YH( names)HY(pace)YH( default you can use an empty +     prefix, for example:)EP( + +  ) 4 51 PR(xml_schema::namespace_infomap map; + +map[""].name = "http://www.codesynthesis.com/test"; +map[""].schema = "test.xsd";)RP( + +  )0 P(This could result in the follow)HY(ing)YH( XML frag)HY(ment)YH(:)EP( + +  ) 4 70 PR(<?xml version="1.0" ?> +<name xmlns="http://www.codesynthesis.com/test" +      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +      xsi:schemaLocation="http://www.codesynthesis.com/test test.xsd">)RP( + + +  )0 P(Another bit of infor)HY(ma)HY(tion)YH( that you can pass to the seri)HY(al)HY(iza)HY(tion)YH( +     func)HY(tions)YH( is the char)HY(ac)HY(ter)YH( encod)HY(ing)YH( method that you would like to use. +     Common values for this argu)HY(ment)YH( are )SM("US-ASCII")ES(, +     )SM("ISO8859-1")ES(, )SM("UTF-8")ES(, +     )SM("UTF-16BE")ES(, )SM("UTF-16LE")ES(, +     )SM("UCS-4BE")ES(, and )SM("UCS-4LE")ES(. The default +     encod)HY(ing)YH( is )SM("UTF-8")ES(. For more infor)HY(ma)HY(tion)YH( on +     encod)HY(ing)YH( methods see the +     ")R11 2 A(Char)HY(ac)HY(ter)YH( +     Encod)HY(ing)YH()EA(" article from Wikipedia. +  )EP( + +  )0 2 80 H(4.3)WB 177 Sn()WB 84 Sn( Flags)EA()EH( + +  )0 P(Seri)HY(al)HY(iza)HY(tion)YH( flags are the last argu)HY(ment)YH( of every seri)HY(al)HY(iza)HY(tion)YH( +     func)HY(tion)YH(. They allow you to fine-tune the process of seri)HY(al)HY(iza)HY(tion)YH(. +     The flags argu)HY(ment)YH( is optional. +  )EP( + + +  )0 P(The follow)HY(ing)YH( flags are recog)HY(nized)YH( by the seri)HY(al)HY(iza)HY(tion)YH( +     func)HY(tions)YH(:)EP( + +  )0 DL(    )0 DT()SM(xml_schema::flags::dont_initial)HY(ize)YH()ES( +    )DD(Do not initial)HY(ize)YH( the Xerces-C++ runtime. + +    )0 DT()SM(xml_schema::flags::dont_pretty_print)ES( +    )DD(Do not add extra spaces or new lines that make the result)HY(ing)YH( XML +        slightly bigger but easier to read. + +    )0 DT()SM(xml_schema::flags::no_xml_decla)HY(ra)HY(tion)YH()ES( +    )DD(Do not write XML decla)HY(ra)HY(tion)YH( \201<?xml ... ?>\202. +  )LD( + +  )0 P(You can pass several flags by combin)HY(ing)YH( them using the bit-wise OR +     oper)HY(a)HY(tor)YH(. For example:)EP( + +  ) 9 45 PR(std::auto_ptr<type> r = ... +std::ofstream ofs \201"test.xml"\202; +xml_schema::namespace_infomap map; +name \201ofs, +      *r, +      map, +      "UTF-8", +      xml_schema::flags::no_xml_declaration | +      xml_schema::flags::dont_pretty_print\202;)RP( + +  )0 P(For more infor)HY(ma)HY(tion)YH( on the Xerces-C++ runtime initial)HY(iza)HY(tion)YH( +     refer to )0 82 1 A(Section 4.1, "Initial)HY(iz)HY(ing)YH( the Xerces-C++ +     Runtime")82 0 TN TL()Ec /AF f D(. +  )EP( + +  )0 2 81 H(4.4)WB 178 Sn()WB 85 Sn( Error Handling)EA()EH( + +  )0 P(As with the parsing func)HY(tions)YH( \201see )0 67 1 A(Section 3.3, +     "Error Handling")67 0 TN TL()Ec /AF f D(\202, to better under)HY(stand)YH( error handling and +     report)HY(ing)YH( strate)HY(gies)YH( employed by the seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH(, it +     is useful to know that the trans)HY(for)HY(ma)HY(tion)YH( of a stat)HY(i)HY(cally)YH(-typed +     tree to an XML instance docu)HY(ment)YH( happens in two stages. The first +     stage, performed by the gener)HY(ated)YH( code, consist of build)HY(ing)YH( a DOM +     instance from the stat)HY(i)HY(cally)YH(-typed tree . For short, we will call +     this stage the Tree-DOM stage. The second stage, performed by +     Xerces-C++, consists of seri)HY(al)HY(iz)HY(ing)YH( the DOM instance into the XML +     docu)HY(ment)YH(. We will call this stage the DOM-XML stage. +  )EP( + +  )0 P(All seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( except the two that seri)HY(al)HY(ize)YH( into +     a DOM instance come in over)HY(loaded)YH( triples. The first func)HY(tion)YH( +     in such a triple reports error condi)HY(tions)YH( exclu)HY(sively)YH( by throw)HY(ing)YH( +     excep)HY(tions)YH(. It accu)HY(mu)HY(lates)YH( all the seri)HY(al)HY(iza)HY(tion)YH( errors of the +     DOM-XML stage and throws them in a single instance of the +     )SM(xml_schema::seri)HY(al)HY(iza)HY(tion)YH()ES( excep)HY(tion)YH( \201described below\202. +     The second and the third func)HY(tions)YH( in the triple use call)HY(back)YH( +     inter)HY(faces)YH( to report seri)HY(al)HY(iza)HY(tion)YH( errors and warn)HY(ings)YH(. The two +     call)HY(back)YH( inter)HY(faces)YH( are )SM(xml_schema::error_handler)ES( and +     )SM(xercesc::DOMEr)HY(rorHan)HY(dler)YH()ES(. The +     )SM(xml_schema::error_handler)ES( inter)HY(face)YH( is described in +     )0 67 1 A(Section 3.3, "Error Handling")67 0 TN TL()Ec /AF f D(. For more infor)HY(ma)HY(tion)YH( +     on the )SM(xercesc::DOMEr)HY(rorHan)HY(dler)YH()ES( inter)HY(face)YH( refer to the +     Xerces-C++ docu)HY(men)HY(ta)HY(tion)YH(. +  )EP( + +  )0 P(The Tree-DOM stage reports error condi)HY(tions)YH( exclu)HY(sively)YH( by throw)HY(ing)YH( +     excep)HY(tions)YH(. Indi)HY(vid)HY(ual)YH( excep)HY(tions)YH( thrown by the seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( +     are described in the follow)HY(ing)YH( sub-sections. +  )EP( + +  )0 3 82 H(4.4.1)WB 179 Sn()WB 86 Sn( )SM(xml_schema::seri)HY(al)HY(iza)HY(tion)YH()ES()EA()EH( + +  ) 11 39 PR(struct serialization: virtual exception +{ +  serialization \201\202; +  serialization \201const diagnostics&\202; + +  const diagnostics& +  diagnostics \201\202 const; + +  virtual const char* +  what \201\202 const throw \201\202; +};)RP( + +  )0 P(The )SM(xml_schema::diag)HY(nos)HY(tics)YH()ES( class is described in +     )0 68 1 A(Section 3.3.1, ")SM(xml_schema::parsing)ES(")68 0 TN TL()Ec /AF f D(. +     The )SM(xml_schema::seri)HY(al)HY(iza)HY(tion)YH()ES( excep)HY(tion)YH( is thrown if +     there were seri)HY(al)HY(iza)HY(tion)YH( errors reported during the DOM-XML stage. +     If no call)HY(back)YH( inter)HY(face)YH( was provided to the seri)HY(al)HY(iza)HY(tion)YH( func)HY(tion)YH(, +     the excep)HY(tion)YH( contains a list of errors and warn)HY(ings)YH( acces)HY(si)HY(ble)YH( using +     the )SM(diag)HY(nos)HY(tics)YH()ES( func)HY(tion)YH(. +  )EP( + + +  )0 3 83 H(4.4.2)WB 180 Sn()WB 87 Sn( )SM(xml_schema::unex)HY(pected)YH(_element)ES()EA()EH( + +  )0 P(The )SM(xml_schema::unex)HY(pected)YH(_element)ES( excep)HY(tion)YH( is +     described in )0 70 1 A(Section 3.3.3, +     ")SM(xml_schema::unex)HY(pected)YH(_element)ES(")70 0 TN TL()Ec /AF f D(. It is thrown +     by the seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( during the Tree-DOM stage if the +     root element name of the provided DOM instance does not match with +     the name of the element this seri)HY(al)HY(iza)HY(tion)YH( func)HY(tion)YH( is for. +  )EP( + +  )0 3 84 H(4.4.3)WB 181 Sn()WB 88 Sn( )SM(xml_schema::no_type_info)ES()EA()EH( + +  )0 P(The )SM(xml_schema::no_type_info)ES( excep)HY(tion)YH( is +     described in )0 74 1 A(Section 3.3.7, +     ")SM(xml_schema::no_type_info)ES(")74 0 TN TL()Ec /AF f D(. It is thrown +     by the seri)HY(al)HY(iza)HY(tion)YH( func)HY(tions)YH( during the Tree-DOM stage when there +     is no type infor)HY(ma)HY(tion)YH( asso)HY(ci)HY(ated)YH( with a dynamic type of an +     element. Usually, catch)HY(ing)YH( this excep)HY(tion)YH( means that you haven't +     linked the code gener)HY(ated)YH( from the schema defin)HY(ing)YH( the type in +     ques)HY(tion)YH( with your appli)HY(ca)HY(tion)YH( or this schema has been compiled +     without the )SM(--gener)HY(ate)YH(-poly)HY(mor)HY(phic)YH()ES( option. +  )EP( + +  )0 2 85 H(4.5)WB 182 Sn()WB 89 Sn( Seri)HY(al)HY(iz)HY(ing)YH( to )SM(std::ostream)ES()EA()EH( + +  )0 P(In order to seri)HY(al)HY(ize)YH( to )SM(std::ostream)ES( you will need +     an object model, an output stream and, option)HY(ally)YH(, a names)HY(pace)YH( +     infomap. For instance:)EP( + +  ) 14 61 PR(// Obtain the object model. +// +std::auto_ptr<type> r = ... + +// Prepare namespace mapping and schema location information. +// +xml_schema::namespace_infomap map; + +map["t"].name = "http://www.codesynthesis.com/test"; +map["t"].schema = "test.xsd"; + +// Write it out. +// +name \201std::cout, *r, map\202;)RP( + +  )0 P(Note that the output stream is treated as a binary stream. This +     becomes impor)HY(tant)YH( when you use a char)HY(ac)HY(ter)YH( encod)HY(ing)YH( that is wider +     than 8-bit )SM(char)ES(, for instance UTF-16 or UCS-4. For +     example, things will most likely break if you try to seri)HY(al)HY(ize)YH( +     to )SM(std::ostringstream)ES( with UTF-16 or UCS-4 as an +     encod)HY(ing)YH(. This is due to the special value, +     )SM('\2000')ES(, that will most likely occur as part of such +     seri)HY(al)HY(iza)HY(tion)YH( and it won't have the special meaning assumed by +     )SM(std::ostringstream)ES(. +  )EP( + + +  )0 2 86 H(4.6)WB 183 Sn()WB 90 Sn( Seri)HY(al)HY(iz)HY(ing)YH( to )SM(xercesc::XMLFor)HY(mat)HY(Tar)HY(get)YH()ES()EA()EH( + +  )0 P(Seri)HY(al)HY(iz)HY(ing)YH( to an )SM(xercesc::XMLFor)HY(mat)HY(Tar)HY(get)YH()ES( instance +     is similar the )SM(std::ostream)ES( case. For instance: +  )EP( + +  ) 38 63 PR(using std::auto_ptr; + +// Obtain the object model. +// +auto_ptr<type> r = ... + +// Prepare namespace mapping and schema location information. +// +xml_schema::namespace_infomap map; + +map["t"].name = "http://www.codesynthesis.com/test"; +map["t"].schema = "test.xsd"; + +using namespace xercesc; + +XMLPlatformUtils::Initialize \201\202; + +{ +  // Choose a target. +  // +  auto_ptr<XMLFormatTarget> ft; + +  if \201argc != 2\202 +  { +    ft = auto_ptr<XMLFormatTarget> \201new StdOutFormatTarget \201\202\202; +  } +  else +  { +    ft = auto_ptr<XMLFormatTarget> \201 +      new LocalFileFormatTarget \201argv[1]\202\202; +  })WR( + +  // Write it out. +  // +  name \201*ft, *r, map\202; +} + +XMLPlatformUtils::Terminate \201\202;)RP( + +  )0 P(Note that we had to initial)HY(ize)YH( the Xerces-C++ runtime before we +     could call this seri)HY(al)HY(iza)HY(tion)YH( func)HY(tion)YH(.)EP( + +  )0 2 87 H(4.7)WB 184 Sn()WB 91 Sn( Seri)HY(al)HY(iz)HY(ing)YH( to DOM)EA()EH( + +  )0 P(The mapping provides two over)HY(loaded)YH( func)HY(tions)YH( that imple)HY(ment)YH( +     seri)HY(al)HY(iza)HY(tion)YH( to a DOM instance. The first creates a DOM instance +     for you and the second seri)HY(al)HY(izes)YH( to an exist)HY(ing)YH( DOM instance. +     While seri)HY(al)HY(iz)HY(ing)YH( to a new DOM instance is similar to seri)HY(al)HY(iz)HY(ing)YH( +     to )SM(std::ostream)ES( or )SM(xercesc::XMLFor)HY(mat)HY(Tar)HY(get)YH()ES(, +     seri)HY(al)HY(iz)HY(ing)YH( to an exist)HY(ing)YH( DOM instance requires quite a bit of work +     from your side. You will need to set all the custom names)HY(pace)YH( mapping +     attributes as well as the )SM(schemaLo)HY(ca)HY(tion)YH()ES( and/or +     )SM(noNames)HY(paceSchemaLo)HY(ca)HY(tion)YH()ES( attributes. The follow)HY(ing)YH( +     listing should give you an idea about what needs to be done: +  )EP( + +  ) 24 67 PR(// Obtain the object model. +// +std::auto_ptr<type> r = ... + +using namespace xercesc; + +XMLPlatformUtils::Initialize \201\202; + +{ +  // Create a DOM instance. Set custom namespace mapping and schema +  // location attributes. +  // +  DOMDocument& doc = ... + +  // Serialize to DOM. +  // +  name \201doc, *r\202; + +  // Serialize the DOM document to XML. +  // +  ... +} + +XMLPlatformUtils::Terminate \201\202;)RP( + +  )0 P(For more infor)HY(ma)HY(tion)YH( on how to create and seri)HY(al)HY(ize)YH( a DOM instance +     refer to the Xerces-C++ docu)HY(men)HY(ta)HY(tion)YH(. In addi)HY(tion)YH(, the +     )R7 2 A(C++/Tree Mapping +     FAQ)EA( shows how to imple)HY(ment)YH( these oper)HY(a)HY(tions)YH( using the XSD +     runtime util)HY(i)HY(ties)YH(. +  )EP( + +  )0 1 88 H(5)WB 185 Sn()WB 92 Sn( Addi)HY(tional)YH( Func)HY(tion)HY(al)HY(ity)YH()EA()EH( + +  )0 P(The C++/Tree mapping provides a number of optional features +     that can be useful in certain situ)HY(a)HY(tions)YH(. They are described +     in the follow)HY(ing)YH( sections.)EP( + +  )0 2 89 H(5.1)WB 186 Sn()WB 93 Sn( DOM Asso)HY(ci)HY(a)HY(tion)YH()EA()EH( + +  )0 P(Normally, after parsing is complete, the DOM docu)HY(ment)YH( which +     was used to extract the data is discarded. However, the parsing +     func)HY(tions)YH( can be instructed to preserve the DOM docu)HY(ment)YH( +     and create an asso)HY(ci)HY(a)HY(tion)YH( between the DOM nodes and object model +     nodes. When there is an asso)HY(ci)HY(a)HY(tion)YH( between the DOM and +     object model nodes, you can obtain the corre)HY(spond)HY(ing)YH( DOM element +     or attribute node from an object model node as well as perform +     the reverse tran)HY(si)HY(tion)YH(: obtain the corre)HY(spond)HY(ing)YH( object model +     from a DOM element or attribute node.)EP( + +  )0 P(Main)HY(tain)HY(ing)YH( DOM asso)HY(ci)HY(a)HY(tion)YH( is normally useful when the appli)HY(ca)HY(tion)YH( +     needs access to XML constructs that are not preserved in the +     object model, for example, XML comments. +     Another useful aspect of DOM asso)HY(ci)HY(a)HY(tion)YH( is the ability of the +     appli)HY(ca)HY(tion)YH( to navi)HY(gate)YH( the docu)HY(ment)YH( tree using the generic DOM +     inter)HY(face)YH( \201for example, with the help of an XPath proces)HY(sor)YH(\202 +     and then move back to the stat)HY(i)HY(cally)YH(-typed object model. Note +     also that while you can change the under)HY(ly)HY(ing)YH( DOM docu)HY(ment)YH(, +     these changes are not reflected in the object model and will +     be ignored during seri)HY(al)HY(iza)HY(tion)YH(. If you need to not only access +     but also modify some aspects of XML that are not preserved in +     the object model, then type customiza)HY(tion)YH( with custom parsing +     construc)HY(tors)YH( and seri)HY(al)HY(iza)HY(tion)YH( oper)HY(a)HY(tors)YH( should be used instead.)EP( + +  )0 P(To request DOM asso)HY(ci)HY(a)HY(tion)YH( you will need to pass the +     )SM(xml_schema::flags::keep_dom)ES( flag to one of the +     parsing func)HY(tions)YH( \201see )0 66 1 A(Section 3.2, +     "Flags and Prop)HY(er)HY(ties)YH(")66 0 TN TL()Ec /AF f D( for more infor)HY(ma)HY(tion)YH(\202. In this case the +     DOM docu)HY(ment)YH( is retained and will be released when the object model +     is deleted. Note that since DOM nodes "out-live" the parsing func)HY(tion)YH( +     call, you need to initial)HY(ize)YH( the Xerces-C++ runtime before calling +     one of the parsing func)HY(tions)YH( with the )SM(keep_dom)ES( flag and +     termi)HY(nate)YH( it after the object model is destroyed \201see +     )0 65 1 A(Section 3.1, "Initial)HY(iz)HY(ing)YH( the Xerces-C++ Runtime")65 0 TN TL()Ec /AF f D(\202.)EP( + +   )0 P(If the )SM(keep_dom)ES( flag is passed +      as the second argu)HY(ment)YH( to the copy construc)HY(tor)YH( and the copy +      being made is of a complete tree, then the DOM asso)HY(ci)HY(a)HY(tion)YH( +      is also main)HY(tained)YH( in the copy by cloning the under)HY(ly)HY(ing)YH( +      DOM docu)HY(ment)YH( and reestab)HY(lish)HY(ing)YH( the asso)HY(ci)HY(a)HY(tions)YH(. For example:)EP( + +  ) 22 48 PR(using namespace xercesc; + +XMLPlatformUtils::Initialize \201\202; + +{ +  // Parse XML to object model. +  // +  std::auto_ptr<type> r \201root \201 +    "root.xml", +     xml_schema::flags::keep_dom | +     xml_schema::flags::dont_initialize\202\202; + +   // Copy without DOM association. +   // +   type copy1 \201*r\202; + +   // Copy with DOM association. +   // +   type copy2 \201*r, xml_schema::flags::keep_dom\202; +} + +XMLPlatformUtils::Terminate \201\202;)RP( + + +  )0 P(To obtain the corre)HY(spond)HY(ing)YH( DOM node from an object model node +     you will need to call the )SM(_node)ES( acces)HY(sor)YH( func)HY(tion)YH( +     which returns a pointer to )SM(DOMNode)ES(. You can then query +     this DOM node's type and cast it to either )SM(DOMAttr*)ES( +     or )SM(DOMEle)HY(ment)YH(*)ES(. To obtain the corre)HY(spond)HY(ing)YH( object +     model node from a DOM node, the DOM user data API is used. The +     )SM(xml_schema::dom::tree_node_key)ES( vari)HY(able)YH( contains +     the key for object model nodes. The follow)HY(ing)YH( schema and code +     frag)HY(ment)YH( show how to navi)HY(gate)YH( from DOM to object model nodes +     and in the oppo)HY(site)YH( direc)HY(tion)YH(:)EP( + +  ) 7 37 PR(<complexType name="object"> +  <sequence> +    <element name="a" type="string"/> +  </sequence> +</complexType> + +<element name="root" type="object"/>)RP( + +  ) 42 68 PR(using namespace xercesc; + +XMLPlatformUtils::Initialize \201\202; + +{ +  // Parse XML to object model. +  // +  std::auto_ptr<type> r \201root \201 +    "root.xml", +     xml_schema::flags::keep_dom | +     xml_schema::flags::dont_initialize\202\202; + +  DOMNode* n = root->_node \201\202; +  assert \201n->getNodeType \201\202 == DOMNode::ELEMENT_NODE\202; +  DOMElement* re = static_cast<DOMElement*> \201n\202; + +  // Get the 'a' element. Note that it is not necessarily the +  // first child node of 'root' since there could be whitespace +  // nodes before it. +  // +  DOMElement* ae; + +  for \201n = re->getFirstChild \201\202; n != 0; n = n->getNextSibling \201\202\202 +  { +    if \201n->getNodeType \201\202 == DOMNode::ELEMENT_NODE\202 +    { +      ae = static_cast<DOMElement*> \201n\202; +      break; +    } +  } +)WR( +  // Get from the 'a' DOM element to xml_schema::string object model +  // node. +  // +  xml_schema::type& t \201 +    *reinterpret_cast<xml_schema::type*> \201 +       ae->getUserData \201xml_schema::dom::tree_node_key\202\202\202; + +  xml_schema::string& a \201dynamic_cast<xml_schema::string&> \201t\202\202; +} + +XMLPlatformUtils::Terminate \201\202;)RP( + +  )0 P(The 'mixed' example which can be found in the XSD distri)HY(bu)HY(tion)YH( +     shows how to handle the mixed content using DOM asso)HY(ci)HY(a)HY(tion)YH(.)EP( + +  )0 2 90 H(5.2)WB 187 Sn()WB 94 Sn( Binary Seri)HY(al)HY(iza)HY(tion)YH()EA()EH( + +  )0 P(Besides reading from and writing to XML, the C++/Tree mapping +     also allows you to save the object model to and load it from a +     number of prede)HY(fined)YH( as well as custom data repre)HY(sen)HY(ta)HY(tion)YH( +     formats. The prede)HY(fined)YH( binary formats are CDR \201Common Data +     Repre)HY(sen)HY(ta)HY(tion)YH(\202 and XDR \201eXter)HY(nal)YH( Data Repre)HY(sen)HY(ta)HY(tion)YH(\202. A +     custom format can easily be supported by provid)HY(ing)YH( +     inser)HY(tion)YH( and extrac)HY(tion)YH( oper)HY(a)HY(tors)YH( for basic types.)EP( + +  )0 P(Binary seri)HY(al)HY(iza)HY(tion)YH( saves only the data without any meta +     infor)HY(ma)HY(tion)YH( or markup. As a result, saving to and loading +     from a binary repre)HY(sen)HY(ta)HY(tion)YH( can be an order of magni)HY(tude)YH( +     faster than parsing and seri)HY(al)HY(iz)HY(ing)YH( the same data in XML. +     Further)HY(more)YH(, the result)HY(ing)YH( repre)HY(sen)HY(ta)HY(tion)YH( is normally several +     times smaller than the equiv)HY(a)HY(lent)YH( XML repre)HY(sen)HY(ta)HY(tion)YH(. These +     prop)HY(er)HY(ties)YH( make binary seri)HY(al)HY(iza)HY(tion)YH( ideal for inter)HY(nal)YH( data +     exchange and storage. A typical appli)HY(ca)HY(tion)YH( that uses this +     facil)HY(ity)YH( stores the data and commu)HY(ni)HY(cates)YH( within the +     system using a binary format and reads/writes the data +     in XML when commu)HY(ni)HY(cat)HY(ing)YH( with the outside world.)EP( + +  )0 P(In order to request the gener)HY(a)HY(tion)YH( of inser)HY(tion)YH( oper)HY(a)HY(tors)YH( and +     extrac)HY(tion)YH( construc)HY(tors)YH( for a specific prede)HY(fined)YH( or custom +     data repre)HY(sen)HY(ta)HY(tion)YH( stream, you will need to use the +     )SM(--gener)HY(ate)YH(-inser)HY(tion)YH()ES( and )SM(--gener)HY(ate)YH(-extrac)HY(tion)YH()ES( +     compiler options. See the +     )R8 2 A(XSD +     Compiler Command Line Manual)EA( for more infor)HY(ma)HY(tion)YH(.)EP( + +  )0 P(Once the inser)HY(tion)YH( oper)HY(a)HY(tors)YH( and extrac)HY(tion)YH( construc)HY(tors)YH( are +     gener)HY(ated)YH(, you can use the )SM(xml_schema::istream)ES( +     and )SM(xml_schema::ostream)ES( wrapper stream templates +     to save the object model to and load it from a specific format. +     The follow)HY(ing)YH( code frag)HY(ment)YH( shows how to do this using ACE +     \201Adap)HY(tive)YH( Commu)HY(ni)HY(ca)HY(tion)YH( Envi)HY(ron)HY(ment)YH(\202 CDR streams as an example:)EP( + +  ) 8 37 PR(<complexType name="object"> +  <sequence> +    <element name="a" type="string"/> +    <element name="b" type="int"/> +  </sequence> +</complexType> + +<element name="root" type="object"/>)RP( + +  ) 21 51 PR(// Parse XML to object model. +// +std::auto_ptr<type> r \201root \201"root.xml"\202\202; + +// Save to a CDR stream. +// +ACE_OutputCDR ace_ocdr; +xml_schema::ostream<ACE_OutputCDR> ocdr \201ace_ocdr\202; + +ocdr << *r; + +// Load from a CDR stream. +// +ACE_InputCDR ace_icdr \201buf, size\202; +xml_schema::istream<ACE_InputCDR> icdr \201ace_icdr\202; + +std::auto_ptr<object> copy \201new object \201icdr\202\202; + +// Serialize to XML. +// +root \201std::cout, *copy\202;)RP( + +  )0 P(The XSD distri)HY(bu)HY(tion)YH( contains a number of exam)HY(ples)YH( that +     show how to save the object model to and load it from +     CDR, XDR, and a custom format.)EP( + +   + + +  )0 1 91 H(Appendix)WB 188 Sn()WB 95 Sn( A \236 Default and Fixed Values)EA()EH( + +  )0 P(The follow)HY(ing)YH( table summa)HY(rizes)YH( the effect of default and fixed +     values \201spec)HY(i)HY(fied)YH( with the )SM(default)ES( and )SM(fixed)ES( +     attributes, respec)HY(tively)YH(\202 on attribute and element values. The +     )SM(default)ES( and )SM(fixed)ES( attributes are mutu)HY(ally)YH( +     exclu)HY(sive)YH(. It is also worth)HY(while)YH( to note that the fixed value seman)HY(tics)YH( +     is a super)HY(set)YH( of the default value seman)HY(tics)YH(. +  )EP( + +   +  )1 PT( + +  )BR( +)BR( + + +)WB NL +/TE t D NP /OU t D TU PM 1 eq and{/Pn () D showpage}if end restore diff --git a/xsd/doc/cxx/tree/manual/index.xhtml b/xsd/doc/cxx/tree/manual/index.xhtml new file mode 100644 index 0000000..56213e0 --- /dev/null +++ b/xsd/doc/cxx/tree/manual/index.xhtml @@ -0,0 +1,6822 @@ +<?xml version="1.0" encoding="iso-8859-1"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> + +<head> +  <title>C++/Tree Mapping User Manual</title> + +  <meta name="copyright" content="© 2005-2014 Code Synthesis Tools CC"/> +  <meta name="keywords" content="xsd,xml,schema,c++,mapping,data,binding,tree,serialization,guide,manual,examples"/> +  <meta name="description" content="C++/Tree Mapping User Manual"/> +  <meta name="revision" content="4.0.0"/> + +  <link rel="stylesheet" type="text/css" href="../../../default.css" /> + +<style type="text/css"> +  pre { +    padding    : 0 0 0 0em; +    margin     : 0em 0em 0em 0; + +    font-size  : 102% +  } + +  body { +    min-width: 48em; +  } + +  h1 { +    font-weight: bold; +    font-size: 200%; +  } + +  h2 { +    font-weight : bold; +    font-size   : 150%; + +    padding-top : 0.8em; +  } + +  h3 { +    font-size   : 130%; +    padding-top : 0.8em; +  } + +  /* Adjust indentation for three levels. */ +  #container { +    max-width: 48em; +  } + +  #content { +    padding: 0 0.1em 0 4em; +    /*background-color: red;*/ +  } + +  #content h1 { +    margin-left: -2.06em; +  } + +  #content h2 { +    margin-left: -1.33em; +  } + +  /* Title page */ + +  #titlepage { +    padding: 2em 0 1em 0; +    border-bottom: 1px solid black; +  } + +  #titlepage #title { +    font-weight: bold; +    font-size: 200%; +    text-align: center; +    padding: 1em 0 2em 0; +  } + +  /* Lists */ +  ul.list li { +    padding-top      : 0.3em; +    padding-bottom   : 0.3em; +  } + + +  /* Built-in table */ +  #builtin { +    margin: 2em 0 2em 0; + +    border-collapse   : collapse; +    border            : 1px solid; +    border-color      : #000000; + +    font-size        : 11px; +    line-height      : 14px; +  } + +  #builtin th, #builtin td { +    border: 1px solid; +    padding           : 0.9em 0.9em 0.7em 0.9em; +  } + +  #builtin th { +    background : #cde8f6; +  } + +  #builtin td { +    text-align: left; +  } + + +  /* default-fixed */ +  #default-fixed { +    margin: 2em 0 2em 0; + +    border-collapse   : collapse; +    border            : 1px solid; +    border-color      : #000000; + +    font-size        : 11px; +    line-height      : 14px; +  } + +  #default-fixed th, #default-fixed td { +    border: 1px solid; +    padding           : 0.9em 0.9em 0.7em 0.9em; +  } + +  #default-fixed th { +    background : #cde8f6; +  } + +  #default-fixed td { +    text-align: center; +  } + + +  /*  */ +  dl dt { +    padding   : 0.8em 0 0 0; +  } + + +  /* TOC */ +  table.toc { +    border-style      : none; +    border-collapse   : separate; +    border-spacing    : 0; + +    margin            : 0.2em 0 0.2em 0; +    padding           : 0 0 0 0; +  } + +  table.toc tr { +    padding           : 0 0 0 0; +    margin            : 0 0 0 0; +  } + +  table.toc * td, table.toc * th { +    border-style      : none; +    margin            : 0 0 0 0; +    vertical-align    : top; +  } + +  table.toc * th { +    font-weight       : normal; +    padding           : 0em 0.1em 0em 0; +    text-align        : left; +    white-space       : nowrap; +  } + +  table.toc * table.toc th { +    padding-left      : 1em; +  } + +  table.toc * td { +    padding           : 0em 0 0em 0.7em; +    text-align        : left; +  } +</style> + + +</head> + +<body> +<div id="container"> +  <div id="content"> + +  <div class="noprint"> + +  <div id="titlepage"> +    <div id="title">C++/Tree Mapping User Manual</div> + +  <p>Copyright © 2005-2014 CODE SYNTHESIS TOOLS CC</p> + +  <p>Permission is granted to copy, distribute and/or modify this +     document under the terms of the +     <a href="http://www.codesynthesis.com/licenses/fdl-1.2.txt">GNU Free +     Documentation License, version 1.2</a>; with no Invariant Sections, +     no Front-Cover Texts and no Back-Cover Texts. +  </p> + +  <p>This document is available in the following formats: +     <a href="http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/index.xhtml">XHTML</a>, +     <a href="http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/cxx-tree-manual.pdf">PDF</a>, and +     <a href="http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/cxx-tree-manual.ps">PostScript</a>.</p> +  </div> + +  <h1>Table of Contents</h1> + +  <table class="toc"> +    <tr> +      <th></th><td><a href="#0">Preface</a> +        <table class="toc"> +          <tr><th></th><td><a href="#0.1">About This Document</a></td></tr> +	  <tr><th></th><td><a href="#0.2">More Information</a></td></tr> +        </table> +      </td> +    </tr> + +    <tr> +      <th>1</th><td><a href="#1">Introduction</a></td> +    </tr> + +    <tr> +      <th>2</th><td><a href="#2">C++/Tree Mapping</a> +        <table class="toc"> +          <tr> +            <th>2.1</th><td><a href="#2.1">Preliminary Information</a> +              <table class="toc"> +		<tr><th>2.1.1</th><td><a href="#2.1.1">C++ Standard</a></td></tr> +                <tr><th>2.1.2</th><td><a href="#2.1.2">Identifiers</a></td></tr> +                <tr><th>2.1.3</th><td><a href="#2.1.3">Character Type and Encoding</a></td></tr> +                <tr><th>2.1.4</th><td><a href="#2.1.4">XML Schema Namespace</a></td></tr> +		<tr><th>2.1.5</th><td><a href="#2.1.5">Anonymous Types</a></td></tr> +              </table> +            </td> +          </tr> +          <tr> +            <th>2.2</th><td><a href="#2.2">Error Handling</a> +              <table class="toc"> +                <tr><th>2.2.1</th><td><a href="#2.2.1"><code>xml_schema::duplicate_id</code></a></td></tr> +              </table> +            </td> +          </tr> +          <tr> +            <th>2.3</th><td><a href="#2.3">Mapping for <code>import</code> and <code>include</code></a> +              <table class="toc"> +                <tr><th>2.3.1</th><td><a href="#2.3.1">Import</a></td></tr> +		<tr><th>2.3.2</th><td><a href="#2.3.2">Inclusion with Target Namespace</a></td></tr> +		<tr><th>2.3.3</th><td><a href="#2.3.3">Inclusion without Target Namespace</a></td></tr> +              </table> +            </td> +          </tr> +          <tr> +            <th>2.4</th><td><a href="#2.4">Mapping for Namespaces</a></td> +          </tr> +          <tr> +            <th>2.5</th><td><a href="#2.5">Mapping for Built-in Data Types</a> +              <table class="toc"> +                <tr><th>2.5.1</th><td><a href="#2.5.1">Inheritance from Built-in Data Types</a></td></tr> +                <tr><th>2.5.2</th><td><a href="#2.5.2">Mapping for <code>anyType</code></a></td></tr> +                <tr><th>2.5.3</th><td><a href="#2.5.3">Mapping for <code>anySimpleType</code></a></td></tr> +                <tr><th>2.5.4</th><td><a href="#2.5.4">Mapping for <code>QName</code></a></td></tr> +                <tr><th>2.5.5</th><td><a href="#2.5.5">Mapping for <code>IDREF</code></a></td></tr> +		<tr><th>2.5.6</th><td><a href="#2.5.6">Mapping for <code>base64Binary</code> and <code>hexBinary</code></a></td></tr> +		<tr><th>2.5.7</th><td><a href="#2.5.7">Time Zone Representation</a></td></tr> +		<tr><th>2.5.8</th><td><a href="#2.5.8">Mapping for <code>date</code></a></td></tr> +		<tr><th>2.5.9</th><td><a href="#2.5.9">Mapping for <code>dateTime</code></a></td></tr> +		<tr><th>2.5.10</th><td><a href="#2.5.10">Mapping for <code>duration</code></a></td></tr> +		<tr><th>2.5.11</th><td><a href="#2.5.11">Mapping for <code>gDay</code></a></td></tr> +		<tr><th>2.5.12</th><td><a href="#2.5.12">Mapping for <code>gMonth</code></a></td></tr> +		<tr><th>2.5.13</th><td><a href="#2.5.13">Mapping for <code>gMonthDay</code></a></td></tr> +		<tr><th>2.5.14</th><td><a href="#2.5.14">Mapping for <code>gYear</code></a></td></tr> +		<tr><th>2.5.15</th><td><a href="#2.5.15">Mapping for <code>gYearMonth</code></a></td></tr> +		<tr><th>2.5.16</th><td><a href="#2.5.16">Mapping for <code>time</code></a></td></tr> +              </table> +            </td> +          </tr> +          <tr> +            <th>2.6</th><td><a href="#2.6">Mapping for Simple Types</a> +              <table class="toc"> +                <tr><th>2.6.1</th><td><a href="#2.6.1">Mapping for Derivation by Restriction</a></td></tr> +                <tr><th>2.6.2</th><td><a href="#2.6.2">Mapping for Enumerations</a></td></tr> +                <tr><th>2.6.3</th><td><a href="#2.6.3">Mapping for Derivation by List</a></td></tr> +                <tr><th>2.6.4</th><td><a href="#2.6.4">Mapping for Derivation by Union</a></td></tr> +              </table> +            </td> +          </tr> +          <tr> +            <th>2.7</th><td><a href="#2.7">Mapping for Complex Types</a> +              <table class="toc"> +	        <tr><th>2.7.1</th><td><a href="#2.7.1">Mapping for Derivation by Extension</a></td></tr> +                <tr><th>2.7.2</th><td><a href="#2.7.2">Mapping for Derivation by Restriction</a></td></tr> +              </table> +            </td> +          </tr> +          <tr> +            <th>2.8</th><td><a href="#2.8">Mapping for Local Elements and Attributes</a> +              <table class="toc"> +	        <tr><th>2.8.1</th><td><a href="#2.8.1">Mapping for Members with the One Cardinality Class</a></td></tr> +	        <tr><th>2.8.2</th><td><a href="#2.8.2">Mapping for Members with the Optional Cardinality Class</a></td></tr> +	        <tr><th>2.8.3</th><td><a href="#2.8.3">Mapping for Members with the Sequence Cardinality Class</a></td></tr> +		<tr><th>2.8.4</th><td><a href="#2.8.4">Element Order</a></td></tr> +              </table> +            </td> +          </tr> +          <tr> +            <th>2.9</th><td><a href="#2.9">Mapping for Global Elements</a> +              <table class="toc"> +	        <tr><th>2.9.1</th><td><a href="#2.9.1">Element Types</a></td></tr> +	        <tr><th>2.9.2</th><td><a href="#2.9.2">Element Map</a></td></tr> +              </table> +            </td> +          </tr> +          <tr> +            <th>2.10</th><td><a href="#2.10">Mapping for Global Attributes</a></td> +          </tr> +          <tr> +            <th>2.11</th><td><a href="#2.11">Mapping for <code>xsi:type</code> and Substitution Groups</a></td> +          </tr> +          <tr> +            <th>2.12</th><td><a href="#2.12">Mapping for <code>any</code> and <code>anyAttribute</code></a> +              <table class="toc"> +	        <tr><th>2.12.1</th><td><a href="#2.12.1">Mapping for <code>any</code> with the One Cardinality Class</a></td></tr> +	        <tr><th>2.12.2</th><td><a href="#2.12.2">Mapping for <code>any</code> with the Optional Cardinality Class</a></td></tr> +	        <tr><th>2.12.3</th><td><a href="#2.12.3">Mapping for <code>any</code> with the Sequence Cardinality Class</a></td></tr> +		<tr><th>2.12.4</th><td><a href="#2.12.4">Element Wildcard Order</a></td></tr> +		<tr><th>2.12.5</th><td><a href="#2.12.5">Mapping for <code>anyAttribute</code></a></td></tr> +              </table> +            </td> +          </tr> +	  <tr> +            <th>2.13</th><td><a href="#2.13">Mapping for Mixed Content Models</a></td> +          </tr> +        </table> +      </td> +    </tr> + +    <tr> +      <th>3</th><td><a href="#3">Parsing</a> +        <table class="toc"> +          <tr> +            <th>3.1</th><td><a href="#3.1">Initializing the Xerces-C++ Runtime</a></td> +          </tr> +          <tr> +            <th>3.2</th><td><a href="#3.2">Flags and Properties</a></td> +          </tr> +          <tr> +            <th>3.3</th><td><a href="#3.3">Error Handling</a> +              <table class="toc"> +	        <tr><th>3.3.1</th><td><a href="#3.3.1"><code>xml_schema::parsing</code></a></td></tr> +	        <tr><th>3.3.2</th><td><a href="#3.3.2"><code>xml_schema::expected_element</code></a></td></tr> +	        <tr><th>3.3.3</th><td><a href="#3.3.3"><code>xml_schema::unexpected_element</code></a></td></tr> +	        <tr><th>3.3.4</th><td><a href="#3.3.4"><code>xml_schema::expected_attribute</code></a></td></tr> +	        <tr><th>3.3.5</th><td><a href="#3.3.5"><code>xml_schema::unexpected_enumerator</code></a></td></tr> +		<tr><th>3.3.6</th><td><a href="#3.3.6"><code>xml_schema::expected_text_content</code></a></td></tr> +	        <tr><th>3.3.7</th><td><a href="#3.3.7"><code>xml_schema::no_type_info</code></a></td></tr> +	        <tr><th>3.3.8</th><td><a href="#3.3.8"><code>xml_schema::not_derived</code></a></td></tr> +		<tr><th>3.3.9</th><td><a href="#3.3.9"><code>xml_schema::not_prefix_mapping</code></a></td></tr> +              </table> +            </td> +          </tr> +          <tr> +            <th>3.4</th><td><a href="#3.4">Reading from a Local File or URI</a></td> +          </tr> +          <tr> +            <th>3.5</th><td><a href="#3.5">Reading from <code>std::istream</code></a></td> +          </tr> +          <tr> +            <th>3.6</th><td><a href="#3.6">Reading from <code>xercesc::InputSource</code></a></td> +          </tr> +          <tr> +            <th>3.7</th><td><a href="#3.7">Reading from DOM</a></td> +          </tr> +        </table> +      </td> +    </tr> + +    <tr> +      <th>4</th><td><a href="#4">Serialization</a> +        <table class="toc"> +          <tr> +            <th>4.1</th><td><a href="#4.1">Initializing the Xerces-C++ Runtime</a></td> +          </tr> +          <tr> +            <th>4.2</th><td><a href="#4.2">Namespace Infomap and Character Encoding</a></td> +          </tr> +          <tr> +            <th>4.3</th><td><a href="#4.3">Flags</a></td> +          </tr> +          <tr> +            <th>4.4</th><td><a href="#4.4">Error Handling</a> +              <table class="toc"> +	        <tr><th>4.4.1</th><td><a href="#4.4.1"><code>xml_schema::serialization</code></a></td></tr> +		<tr><th>4.4.2</th><td><a href="#4.4.2"><code>xml_schema::unexpected_element</code></a></td></tr> +		<tr><th>4.4.3</th><td><a href="#4.4.3"><code>xml_schema::no_type_info</code></a></td></tr> +              </table> +            </td> +          </tr> +          <tr> +            <th>4.5</th><td><a href="#4.5">Serializing to <code>std::ostream</code></a></td> +          </tr> +          <tr> +            <th>4.6</th><td><a href="#4.6">Serializing to <code>xercesc::XMLFormatTarget</code></a></td> +          </tr> +          <tr> +            <th>4.7</th><td><a href="#4.7">Serializing to DOM</a></td> +          </tr> +        </table> +      </td> +    </tr> + +    <tr> +      <th>5</th><td><a href="#5">Additional Functionality</a> +        <table class="toc"> +          <tr> +            <th>5.1</th><td><a href="#5.1">DOM Association</a></td> +          </tr> +          <tr> +            <th>5.2</th><td><a href="#5.2">Binary Serialization</a></td> +          </tr> +        </table> +      </td> +    </tr> + +    <tr> +      <th></th><td><a href="#A">Appendix A — Default and Fixed Values</a></td> +    </tr> + +  </table> +  </div> + +  <h1><a name="0">Preface</a></h1> + +  <h2><a name="0.1">About This Document</a></h2> + +  <p>This document describes the mapping of W3C XML Schema +     to the C++ programming language as implemented by +     <a href="http://www.codesynthesis.com/products/xsd">CodeSynthesis +     XSD</a> - an XML Schema to C++ data binding compiler. The mapping +     represents information stored in XML instance documents as a +     statically-typed, tree-like in-memory data structure and is +     called C++/Tree. +  </p> + +  <p>Revision 4.0.0<br/> <!-- Remember to change revision in other places --> +     This revision of the manual describes the C++/Tree +     mapping as implemented by CodeSynthesis XSD version 4.0.0. +  </p> + +  <p>This document is available in the following formats: +     <a href="http://codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/index.xhtml">XHTML</a>, +     <a href="http://codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/cxx-tree-manual.pdf">PDF</a>, and +     <a href="http://codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/cxx-tree-manual.ps">PostScript</a>.</p> + +  <h2><a name="0.2">More Information</a></h2> + +  <p>Beyond this manual, you may also find the following sources of +     information useful:</p> + +  <ul class="list"> +    <li><a href="http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/guide/">C++/Tree +        Mapping Getting Started Guide</a></li> + +    <li><a href="http://wiki.codesynthesis.com/Tree/Customization_guide">C++/Tree +        Mapping Customization Guide</a></li> + +    <li><a href="http://wiki.codesynthesis.com/Tree/FAQ">C++/Tree +        Mapping Frequently Asked Questions (FAQ)</a></li> + +    <li><a href="http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml">XSD +        Compiler Command Line Manual</a></li> + +    <li>The <code>examples/cxx/tree/</code> directory in the XSD +        distribution contains a collection of examples and a README +        file with an overview of each example.</li> + +    <li>The <code>README</code> file in the XSD distribution explains +        how to compile the examples on various platforms.</li> + +    <li>The <a href="http://www.codesynthesis.com/mailman/listinfo/xsd-users">xsd-users</a> +        mailing list is a place to ask questions. Furthermore the +        <a href="http://www.codesynthesis.com/pipermail/xsd-users/">archives</a> +        may already have answers to some of your questions.</li> +  </ul> + + +  <h1><a name="1">1 Introduction</a></h1> + +  <p>C++/Tree is a W3C XML Schema to C++ mapping that represents the +     data stored in XML as a statically-typed, vocabulary-specific +     object model. Based on a formal description of an XML vocabulary +     (schema), the C++/Tree mapping produces a tree-like data structure +     suitable for in-memory processing as well as XML parsing and +     serialization code.</p> + +  <p>A typical application that processes XML documents usually +     performs the following three steps: it first reads (parses) an XML +     instance document to an object model, it then performs +     some useful computations on that model which may involve +     modification of the model, and finally it may write (serialize) +     the modified object model back to XML. +  </p> + +  <p>The C++/Tree mapping consists of C++ types that represent the +     given vocabulary (<a href="#2">Chapter 2, "C++/Tree Mapping"</a>), +     a set of parsing functions that convert XML documents to +     a tree-like in-memory data structure (<a href="#3">Chapter 3, +     "Parsing"</a>), and a set of serialization functions that convert +     the object model back to XML (<a href="#4">Chapter 4, +     "Serialization"</a>). Furthermore, the mapping provides a number +     of additional features, such as DOM association and binary +     serialization, that can be useful in some applications +     (<a href="#5">Chapter 5, "Additional Functionality"</a>). +  </p> + + +  <!-- Chapter 2 --> + + +  <h1><a name="2">2 C++/Tree Mapping</a></h1> + +  <h2><a name="2.1">2.1 Preliminary Information</a></h2> + +  <h3><a name="2.1.1">2.1.1 C++ Standard</a></h3> + +  <p>The C++/Tree mapping provides support for ISO/IEC C++ 1998/2003 (C++98) +     and ISO/IEC C++ 2011 (C++11). To select the C++ standard for the +     generated code we use the <code>--std</code> XSD compiler command +     line option. While the majority of the examples in this manual use +     C++98, support for the new functionality and library components +     introduced in C++11 are discussed throughout the document.</p> + +  <h3><a name="2.1.2">2.1.2 Identifiers</a></h3> + +  <p>XML Schema names may happen to be reserved C++ keywords or contain +     characters that are illegal in C++ identifiers. To avoid C++ compilation +     problems, such names are changed (escaped) when mapped to C++. If an +     XML Schema name is a C++ keyword, the "_" suffix is added to it. All +     character of an XML Schema name that are not allowed in C++ identifiers +     are replaced with "_". +  </p> + +  <p>For example, XML Schema name <code>try</code> will be mapped to +     C++ identifier <code>try_</code>. Similarly, XML Schema name +     <code>strange.na-me</code> will be mapped to C++ identifier +     <code>strange_na_me</code>. +  </p> + +  <p>Furthermore, conflicts between type names and function names in the +     same scope are resolved using name escaping. Such conflicts include +     both a global element (which is mapped to a set of parsing and/or +     serialization functions or element types, see <a href="#2.9">Section +     2.9, "Mapping for Global Elements"</a>) and a global type sharing the +     same name as well as a local element or attribute inside a type having +     the same name as the type itself.</p> + +  <p>For example, if we had a global type <code>catalog</code> +     and a global element with the same name then the type would be +     mapped to a C++ class with name <code>catalog</code> while the +     parsing functions corresponding to the global element would have +     their names escaped as <code>catalog_</code>. +  </p> + +  <p>By default the mapping uses the so-called K&R (Kernighan and +     Ritchie) identifier naming convention which is also used throughout +     this manual. In this convention both type and function names are in +     lower case and words are separated by underscores. If your application +     code or schemas use a different notation, you may want to change the +     naming convention used by the mapping for consistency. +     The compiler supports a set of widely-used naming conventions +     that you can select with the <code>--type-naming</code> and +     <code>--function-naming</code> options. You can also further +     refine one of the predefined conventions or create a completely +     custom naming scheme by using the  <code>--*-regex</code> options. +     For more detailed information on these options refer to the NAMING +     CONVENTION section in the <a href="http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml">XSD +     Compiler Command Line Manual</a>.</p> + +  <h3><a name="2.1.3">2.1.3 Character Type and Encoding</a></h3> + +  <p>The code that implements the mapping, depending on the +     <code>--char-type</code>  option, is generated using either +     <code>char</code> or <code>wchar_t</code> as the character +     type. In this document code samples use symbol <code>C</code> +     to refer to the character type you have selected when translating +     your schemas, for example <code>std::basic_string<C></code>. +  </p> + +  <p>Another aspect of the mapping that depends on the character type +     is character encoding. For the <code>char</code> character type +     the default encoding is UTF-8. Other supported encodings are +     ISO-8859-1, Xerces-C++ Local Code Page (LPC), as well as +     custom encodings and can be selected with the +     <code>--char-encoding</code> command line option.</p> + +  <p>For the <code>wchar_t</code> character type the encoding is +     automatically selected between UTF-16 and UTF-32/UCS-4 depending +     on the size of the <code>wchar_t</code> type. On some platforms +     (for example, Windows with Visual C++ and AIX with IBM XL C++) +     <code>wchar_t</code> is 2 bytes long. For these platforms the +     encoding is UTF-16. On other platforms <code>wchar_t</code> is 4 bytes +     long and UTF-32/UCS-4 is used.</p> + +  <h3><a name="2.1.4">2.1.4 XML Schema Namespace</a></h3> + +  <p>The mapping relies on some predefined types, classes, and functions +     that are logically defined in the XML Schema namespace reserved for +     the XML Schema language (<code>http://www.w3.org/2001/XMLSchema</code>). +     By default, this namespace is mapped to C++ namespace +     <code>xml_schema</code>. It is automatically accessible +     from a C++ compilation unit that includes a header file generated +     from an XML Schema definition. +  </p> + +  <p>Note that, if desired, the default mapping of this namespace can be +     changed as described in <a href="#2.4">Section 2.4, "Mapping for +     Namespaces"</a>. +  </p> + + +  <h3><a name="2.1.5">2.1.5 Anonymous Types</a></h3> + +  <p>For the purpose of code generation, anonymous types defined in +     XML Schema are automatically assigned names that are derived +     from enclosing attributes and elements. Otherwise, such types +     follows standard mapping rules for simple and complex type +     definitions (see <a href="#2.6">Section 2.6, "Mapping for Simple Types"</a> +     and <a href="#2.7">Section 2.7, "Mapping for Complex Types"</a>). +     For example, in the following schema fragment: +  </p> + +  <pre class="xml"> +<element name="object"> +  <complexType> +    ... +  </complexType> +</element> +  </pre> + +  <p>The anonymous type defined inside element <code>object</code> will +     be given name <code>object</code>. The compiler has a number of +     options that control the process of anonymous type naming. For more +     information refer to the <a href="http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml">XSD +     Compiler Command Line Manual</a>.</p> + + +  <h2><a name="2.2">2.2 Error Handling</a></h2> + +  <p>The mapping uses the C++ exception handling mechanism as a primary way +     of reporting error conditions. All exceptions that are specified in +     this mapping derive from <code>xml_schema::exception</code> which +     itself is derived from <code>std::exception</code>: +  </p> + +  <pre class="c++"> +struct exception: virtual std::exception +{ +  friend +  std::basic_ostream<C>& +  operator<< (std::basic_ostream<C>& os, const exception& e) +  { +    e.print (os); +    return os; +  } + +protected: +  virtual void +  print (std::basic_ostream<C>&) const = 0; +}; +  </pre> + +  <p>The exception hierarchy supports "virtual" <code>operator<<</code> +     which allows you to obtain diagnostics corresponding to the thrown +     exception using the base exception interface. For example:</p> + +  <pre class="c++"> +try +{ +  ... +} +catch (const xml_schema::exception& e) +{ +  cerr << e << endl; +} +  </pre> + +  <p>The following sub-sections describe exceptions thrown by the +     types that constitute the object model. +     <a href="#3.3">Section 3.3, "Error Handling"</a> of +     <a href="#3">Chapter 3, "Parsing"</a> describes exceptions +     and error handling mechanisms specific to the parsing functions. +     <a href="#4.4">Section 4.4, "Error Handling"</a> of +     <a href="#4">Chapter 4, "Serialization"</a> describes exceptions +     and error handling mechanisms specific to the serialization functions. +  </p> + + +  <h3><a name="2.2.1">2.2.1 <code>xml_schema::duplicate_id</code></a></h3> + +  <pre class="c++"> +struct duplicate_id: virtual exception +{ +  duplicate_id (const std::basic_string<C>& id); + +  const std::basic_string<C>& +  id () const; + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::duplicate_id</code> is thrown when +     a conflicting instance of <code>xml_schema::id</code> (see +     <a href="#2.5">Section 2.5, "Mapping for Built-in Data Types"</a>) +     is added to a tree. The offending ID value can be obtained using +     the <code>id</code> function. +  </p> + +  <h2><a name="2.3">2.3 Mapping for <code>import</code> and <code>include</code></a></h2> + +  <h3><a name="2.3.1">2.3.1 Import</a></h3> + +  <p>The XML Schema <code>import</code> element is mapped to the C++ +     Preprocessor <code>#include</code> directive. The value of +     the <code>schemaLocation</code> attribute is used to derive +     the name of the header file that appears in the <code>#include</code> +     directive. For instance: +  </p> + +  <pre class="xml"> +<import namespace="http://www.codesynthesis.com/test" +        schemaLocation="test.xsd"/> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +#include "test.hxx" +  </pre> + +  <p>Note that you will need to compile imported schemas separately +     in order to produce corresponding header files.</p> + +  <h3><a name="2.3.2">2.3.2 Inclusion with Target Namespace</a></h3> + +  <p>The XML Schema <code>include</code> element which refers to a schema +     with a target namespace or appears in a schema without a target namespace +     follows the same mapping rules as the <code>import</code> element, +     see <a href="#2.3.1">Section 2.3.1, "Import"</a>. +  </p> + +  <h3><a name="2.3.3">2.3.3 Inclusion without Target Namespace</a></h3> + +  <p>For the XML Schema <code>include</code> element which refers to a schema +     without a target namespace and appears in a schema with a target +     namespace (such inclusion sometimes called "chameleon inclusion"), +     declarations and definitions from the included schema are generated +     in-line in the namespace of the including schema as if they were +     declared and defined there verbatim. For example, consider the +     following two schemas: +  </p> + +  <pre class="xml"> +<-- common.xsd --> +<schema> +  <complexType name="type"> +  ... +  </complexType> +</schema> + +<-- test.xsd --> +<schema targetNamespace="http://www.codesynthesis.com/test"> +  <include schemaLocation="common.xsd"/> +</schema> +  </pre> + +  <p>The fragment of interest from the generated header file for +     <code>text.xsd</code> would look like this:</p> + +  <pre class="c++"> +// test.hxx +namespace test +{ +  class type +  { +    ... +  }; +} +  </pre> + +  <h2><a name="2.4">2.4 Mapping for Namespaces</a></h2> + +  <p>An XML Schema namespace is mapped to one or more nested C++ +     namespaces. XML Schema namespaces are identified by URIs. +     By default, a namespace URI is mapped to a sequence of +     C++ namespace names by removing the protocol and host parts +     and splitting the rest into a sequence of names with '<code>/</code>' +     as the name separator. For instance: +  </p> + +  <pre class="xml"> +<schema targetNamespace="http://www.codesynthesis.com/system/test"> +  ... +</schema> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +namespace system +{ +  namespace test +  { +    ... +  } +} +  </pre> + +  <p>The default mapping of namespace URIs to C++ namespace names can be +     altered using the <code>--namespace-map</code> and +     <code>--namespace-regex</code> options. See  the +     <a href="http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml">XSD +     Compiler Command Line Manual</a> for more information. +  </p> + +  <h2><a name="2.5">2.5 Mapping for Built-in Data Types</a></h2> + +  <p>The mapping of XML Schema built-in data types to C++ types is +     summarized in the table below.</p> + +  <!-- border="1" is necessary for html2ps --> +  <table id="builtin" border="1"> +    <tr> +      <th>XML Schema type</th> +      <th>Alias in the <code>xml_schema</code> namespace</th> +      <th>C++ type</th> +    </tr> + +    <tr> +      <th colspan="3">anyType and anySimpleType types</th> +    </tr> +    <tr> +      <td><code>anyType</code></td> +      <td><code>type</code></td> +      <td><a href="#2.5.2">Section 2.5.2, "Mapping for <code>anyType</code>"</a></td> +    </tr> +    <tr> +      <td><code>anySimpleType</code></td> +      <td><code>simple_type</code></td> +      <td><a href="#2.5.3">Section 2.5.3, "Mapping for <code>anySimpleType</code>"</a></td> +    </tr> + +    <tr> +      <th colspan="3">fixed-length integral types</th> +    </tr> +    <!-- 8-bit --> +    <tr> +      <td><code>byte</code></td> +      <td><code>byte</code></td> +      <td><code>signed char</code></td> +    </tr> +    <tr> +      <td><code>unsignedByte</code></td> +      <td><code>unsigned_byte</code></td> +      <td><code>unsigned char</code></td> +    </tr> + +    <!-- 16-bit --> +    <tr> +      <td><code>short</code></td> +      <td><code>short_</code></td> +      <td><code>short</code></td> +    </tr> +    <tr> +      <td><code>unsignedShort</code></td> +      <td><code>unsigned_short</code></td> +      <td><code>unsigned short</code></td> +    </tr> + +    <!-- 32-bit --> +    <tr> +      <td><code>int</code></td> +      <td><code>int_</code></td> +      <td><code>int</code></td> +    </tr> +    <tr> +      <td><code>unsignedInt</code></td> +      <td><code>unsigned_int</code></td> +      <td><code>unsigned int</code></td> +    </tr> + +    <!-- 64-bit --> +    <tr> +      <td><code>long</code></td> +      <td><code>long_</code></td> +      <td><code>long long</code></td> +    </tr> +    <tr> +      <td><code>unsignedLong</code></td> +      <td><code>unsigned_long</code></td> +      <td><code>unsigned long long</code></td> +    </tr> + +    <tr> +      <th colspan="3">arbitrary-length integral types</th> +    </tr> +    <tr> +      <td><code>integer</code></td> +      <td><code>integer</code></td> +      <td><code>long long</code></td> +    </tr> +    <tr> +      <td><code>nonPositiveInteger</code></td> +      <td><code>non_positive_integer</code></td> +      <td><code>long long</code></td> +    </tr> +    <tr> +      <td><code>nonNegativeInteger</code></td> +      <td><code>non_negative_integer</code></td> +      <td><code>unsigned long long</code></td> +    </tr> +    <tr> +      <td><code>positiveInteger</code></td> +      <td><code>positive_integer</code></td> +      <td><code>unsigned long long</code></td> +    </tr> +    <tr> +      <td><code>negativeInteger</code></td> +      <td><code>negative_integer</code></td> +      <td><code>long long</code></td> +    </tr> + +    <tr> +      <th colspan="3">boolean types</th> +    </tr> +    <tr> +      <td><code>boolean</code></td> +      <td><code>boolean</code></td> +      <td><code>bool</code></td> +    </tr> + +    <tr> +      <th colspan="3">fixed-precision floating-point types</th> +    </tr> +    <tr> +      <td><code>float</code></td> +      <td><code>float_</code></td> +      <td><code>float</code></td> +    </tr> +    <tr> +      <td><code>double</code></td> +      <td><code>double_</code></td> +      <td><code>double</code></td> +    </tr> + +    <tr> +      <th colspan="3">arbitrary-precision floating-point types</th> +    </tr> +    <tr> +      <td><code>decimal</code></td> +      <td><code>decimal</code></td> +      <td><code>double</code></td> +    </tr> + +    <tr> +      <th colspan="3">string types</th> +    </tr> +    <tr> +      <td><code>string</code></td> +      <td><code>string</code></td> +      <td>type derived from <code>std::basic_string</code></td> +    </tr> +    <tr> +      <td><code>normalizedString</code></td> +      <td><code>normalized_string</code></td> +      <td>type derived from <code>string</code></td> +    </tr> +    <tr> +      <td><code>token</code></td> +      <td><code>token</code></td> +      <td>type derived from <code>normalized_string</code></td> +    </tr> +    <tr> +      <td><code>Name</code></td> +      <td><code>name</code></td> +      <td>type derived from <code>token</code></td> +    </tr> +    <tr> +      <td><code>NMTOKEN</code></td> +      <td><code>nmtoken</code></td> +      <td>type derived from <code>token</code></td> +    </tr> +    <tr> +      <td><code>NMTOKENS</code></td> +      <td><code>nmtokens</code></td> +      <td>type derived from <code>sequence<nmtoken></code></td> +    </tr> +    <tr> +      <td><code>NCName</code></td> +      <td><code>ncname</code></td> +      <td>type derived from <code>name</code></td> +    </tr> +    <tr> +      <td><code>language</code></td> +      <td><code>language</code></td> +      <td>type derived from <code>token</code></td> +    </tr> + +    <tr> +      <th colspan="3">qualified name</th> +    </tr> +    <tr> +      <td><code>QName</code></td> +      <td><code>qname</code></td> +      <td><a href="#2.5.4">Section 2.5.4, "Mapping for <code>QName</code>"</a></td> +    </tr> + +    <tr> +      <th colspan="3">ID/IDREF types</th> +    </tr> +    <tr> +      <td><code>ID</code></td> +      <td><code>id</code></td> +      <td>type derived from <code>ncname</code></td> +    </tr> +    <tr> +      <td><code>IDREF</code></td> +      <td><code>idref</code></td> +      <td><a href="#2.5.5">Section 2.5.5, "Mapping for <code>IDREF</code>"</a></td> +    </tr> +    <tr> +      <td><code>IDREFS</code></td> +      <td><code>idrefs</code></td> +      <td>type derived from <code>sequence<idref></code></td> +    </tr> + +    <tr> +      <th colspan="3">URI types</th> +    </tr> +    <tr> +      <td><code>anyURI</code></td> +      <td><code>uri</code></td> +      <td>type derived from <code>std::basic_string</code></td> +    </tr> + +    <tr> +      <th colspan="3">binary types</th> +    </tr> +    <tr> +      <td><code>base64Binary</code></td> +      <td><code>base64_binary</code></td> +      <td rowspan="2"><a href="#2.5.6">Section 2.5.6, "Mapping for +         <code>base64Binary</code> and <code>hexBinary</code>"</a></td> +    </tr> +    <tr> +      <td><code>hexBinary</code></td> +      <td><code>hex_binary</code></td> +    </tr> + +    <tr> +      <th colspan="3">date/time types</th> +    </tr> +    <tr> +      <td><code>date</code></td> +      <td><code>date</code></td> +      <td><a href="#2.5.8">Section 2.5.8, "Mapping for +          <code>date</code>"</a></td> +    </tr> +    <tr> +      <td><code>dateTime</code></td> +      <td><code>date_time</code></td> +      <td><a href="#2.5.9">Section 2.5.9, "Mapping for +          <code>dateTime</code>"</a></td> +    </tr> +    <tr> +      <td><code>duration</code></td> +      <td><code>duration</code></td> +      <td><a href="#2.5.10">Section 2.5.10, "Mapping for +          <code>duration</code>"</a></td> +    </tr> +    <tr> +      <td><code>gDay</code></td> +      <td><code>gday</code></td> +      <td><a href="#2.5.11">Section 2.5.11, "Mapping for +          <code>gDay</code>"</a></td> +    </tr> +    <tr> +      <td><code>gMonth</code></td> +      <td><code>gmonth</code></td> +      <td><a href="#2.5.12">Section 2.5.12, "Mapping for +          <code>gMonth</code>"</a></td> +    </tr> +    <tr> +      <td><code>gMonthDay</code></td> +      <td><code>gmonth_day</code></td> +      <td><a href="#2.5.13">Section 2.5.13, "Mapping for +          <code>gMonthDay</code>"</a></td> +    </tr> +    <tr> +      <td><code>gYear</code></td> +      <td><code>gyear</code></td> +      <td><a href="#2.5.14">Section 2.5.14, "Mapping for +          <code>gYear</code>"</a></td> +    </tr> +    <tr> +      <td><code>gYearMonth</code></td> +      <td><code>gyear_month</code></td> +      <td><a href="#2.5.15">Section 2.5.15, "Mapping for +          <code>gYearMonth</code>"</a></td> +    </tr> +    <tr> +      <td><code>time</code></td> +      <td><code>time</code></td> +      <td><a href="#2.5.16">Section 2.5.16, "Mapping for +          <code>time</code>"</a></td> +    </tr> + +    <tr> +      <th colspan="3">entity types</th> +    </tr> +    <tr> +      <td><code>ENTITY</code></td> +      <td><code>entity</code></td> +      <td>type derived from <code>name</code></td> +    </tr> +    <tr> +      <td><code>ENTITIES</code></td> +      <td><code>entities</code></td> +      <td>type derived from <code>sequence<entity></code></td> +    </tr> +  </table> + +  <p>All XML Schema built-in types are mapped to C++ classes that are +     derived from the <code>xml_schema::simple_type</code> class except +     where the mapping is to a fundamental C++ type.</p> + +  <p>The <code>sequence</code> class template is defined in an +     implementation-specific namespace. It conforms to the +     sequence interface as defined by the ISO/ANSI Standard for +     C++ (ISO/IEC 14882:1998, Section 23.1.1, "Sequences"). +     Practically, this means that you can treat such a sequence +     as if it was <code>std::vector</code>. One notable extension +     to the standard interface that is available only for +     sequences of non-fundamental C++ types is the addition of +     the overloaded <code>push_back</code> and <code>insert</code> +     member functions which instead of the constant reference +     to the element type accept automatic pointer (<code>std::auto_ptr</code> +     or <code>std::unique_ptr</code>, depending on the C++ standard +     selected) to the element type. These functions assume ownership +     of the pointed to object and reset the passed automatic pointer. +  </p> + +  <h3><a name="2.5.1">2.5.1 Inheritance from Built-in Data Types</a></h3> + +  <p>In cases where the mapping calls for an inheritance from a built-in +     type which is mapped to a fundamental C++ type, a proxy type is +     used instead of the fundamental C++ type (C++ does not allow +     inheritance from fundamental types). For instance:</p> + +  <pre class="xml"> +<simpleType name="my_int"> +  <restriction base="int"/> +</simpleType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class my_int: public fundamental_base<int> +{ +  ... +}; +  </pre> + +  <p>The <code>fundamental_base</code> class template provides a close +     emulation (though not exact) of a fundamental C++ type. +     It is defined in an implementation-specific namespace and has the +     following interface:</p> + +  <pre class="c++"> +template <typename X> +class fundamental_base: public simple_type +{ +public: +  fundamental_base (); +  fundamental_base (X) +  fundamental_base (const fundamental_base&) + +public: +  fundamental_base& +  operator= (const X&); + +public: +  operator const X & () const; +  operator X& (); + +  template <typename Y> +  operator Y () const; + +  template <typename Y> +  operator Y (); +}; +  </pre> + +  <h3><a name="2.5.2">2.5.2 Mapping for <code>anyType</code></a></h3> + +  <p>The XML Schema <code>anyType</code> built-in data type is mapped to the +     <code>xml_schema::type</code> C++ class:</p> + +  <pre class="c++"> +class type +{ +public: +  virtual +  ~type (); + +  type (); +  type (const type&); + +  type& +  operator= (const type&); + +  virtual type* +  _clone () const; + +  // anyType DOM content. +  // +public: +  typedef element_optional dom_content_optional; + +  const dom_content_optional& +  dom_content () const; + +  dom_content_optional& +  dom_content (); + +  void +  dom_content (const xercesc::DOMElement&); + +  void +  dom_content (xercesc::DOMElement*); + +  void +  dom_content (const dom_content_optional&); + +  const xercesc::DOMDocument& +  dom_content_document () const; + +  xercesc::DOMDocument& +  dom_content_document (); + +  bool +  null_content () const; + +  // DOM association. +  // +public: +  const xercesc::DOMNode* +  _node () const; + +  xercesc::DOMNode* +  _node (); +}; +  </pre> + +  <p>When <code>xml_schema::type</code> is used to create an instance +     (as opposed to being a base of a derived type), it represents +     the XML Schema <code>anyType</code> type. <code>anyType</code> +     allows any attributes and any content in any order. In the +     C++/Tree mapping this content can be represented as a DOM +     fragment, similar to XML Schema wildcards (<a href="#2.12">Section +     2.12, "Mapping for <code>any</code> and +     <code>anyAttribute</code>"</a>).</p> + +  <p>To enable automatic extraction of <code>anyType</code> content +     during parsing, the <code>--generate-any-type</code> option must be +     specified. Because the DOM API is used to access such content, the +     Xerces-C++ runtime should be initialized by the application prior to +     parsing and should remain initialized for the lifetime of objects +     with the DOM content. For more information on the Xerces-C++ runtime +     initialization see <a href="#3.1">Section 3.1, "Initializing the +     Xerces-C++ Runtime"</a>.</p> + +  <p>The DOM content is stored as the optional DOM element container +     and the DOM content accessors and modifiers presented above are +     identical to those generated for an optional element wildcard. +     Refer to <a href="#2.12.2">Section 2.12.2, "Mapping for <code>any</code> +     with the Optional Cardinality Class"</a> for details on their +     semantics.</p> + +  <p>The <code>dom_content_document()</code> function returns the +     DOM document used to store the raw XML content corresponding +     to the <code>anyType</code> instance. It is equivalent to the +     <code>dom_document()</code> function generated for types +     with wildcards.</p> + +  <p>The <code>null_content()</code> accessor is an optimization function +     that allows us to check for the lack of content without actually +     creating its empty representation, that is, empty DOM document for +     <code>anyType</code> or empty string for <code>anySimpleType</code> +     (see the following section for details on <code>anySimpleType</code>).</p> + +  <p>For more information on DOM association refer to +     <a href="#5.1">Section 5.1, "DOM Association"</a>.</p> + +  <h3><a name="2.5.3">2.5.3 Mapping for <code>anySimpleType</code></a></h3> + +  <p>The XML Schema <code>anySimpleType</code> built-in data type is mapped +     to the <code>xml_schema::simple_type</code> C++ class:</p> + +  <pre class="c++"> +class simple_type: public type +{ +public: +  simple_type (); +  simple_type (const C*); +  simple_type (const std::basic_string<C>&); + +  simple_type (const simple_type&); + +  simple_type& +  operator= (const simple_type&); + +  virtual simple_type* +  _clone () const; + +  // anySimpleType text content. +  // +public: +  const std::basic_string<C>& +  text_content () const; + +  std::basic_string<C>& +  text_content (); + +  void +  text_content (const std::basic_string<C>&); +}; +  </pre> + +  <p>When <code>xml_schema::simple_type</code> is used to create an instance +     (as opposed to being a base of a derived type), it represents +     the XML Schema <code>anySimpleType</code> type. <code>anySimpleType</code> +     allows any simple content. In the C++/Tree mapping this content can +     be represented as a string and accessed or modified with the +     <code>text_content()</code> functions shown above.</p> + +  <h3><a name="2.5.4">2.5.4 Mapping for <code>QName</code></a></h3> + +  <p>The XML Schema <code>QName</code> built-in data type is mapped to the +     <code>xml_schema::qname</code> C++ class:</p> + +  <pre class="c++"> +class qname: public simple_type +{ +public: +  qname (const ncname&); +  qname (const uri&, const ncname&); +  qname (const qname&); + +public: +  qname& +  operator= (const qname&); + +public: +  virtual qname* +  _clone () const; + +public: +  bool +  qualified () const; + +  const uri& +  namespace_ () const; + +  const ncname& +  name () const; +}; +  </pre> + +  <p>The <code>qualified</code> accessor function can be used to determine +     if the name is qualified.</p> + +  <h3><a name="2.5.5">2.5.5 Mapping for <code>IDREF</code></a></h3> + +  <p>The XML Schema <code>IDREF</code> built-in data type is mapped to the +     <code>xml_schema::idref</code> C++ class. This class implements the +     smart pointer C++ idiom:</p> + +  <pre class="c++"> +class idref: public ncname +{ +public: +  idref (const C* s); +  idref (const C* s, std::size_t n); +  idref (std::size_t n, C c); +  idref (const std::basic_string<C>&); +  idref (const std::basic_string<C>&, +         std::size_t pos, +         std::size_t n = npos); + +public: +  idref (const idref&); + +public: +  virtual idref* +  _clone () const; + +public: +  idref& +  operator= (C c); + +  idref& +  operator= (const C* s); + +  idref& +  operator= (const std::basic_string<C>&) + +  idref& +  operator= (const idref&); + +public: +  const type* +  operator-> () const; + +  type* +  operator-> (); + +  const type& +  operator* () const; + +  type& +  operator* (); + +  const type* +  get () const; + +  type* +  get (); + +  // Conversion to bool. +  // +public: +  typedef void (idref::*bool_convertible)(); +  operator bool_convertible () const; +}; +  </pre> + +  <p>The object, <code>idref</code> instance refers to, is the immediate +     container of the matching <code>id</code> instance. For example, +     with the following instance document and schema: +  </p> + + +  <pre class="xml"> +<!-- test.xml --> +<root> +  <object id="obj-1" text="hello"/> +  <reference>obj-1</reference> +</root> + +<!-- test.xsd --> +<schema> +  <complexType name="object_type"> +    <attribute name="id" type="ID"/> +    <attribute name="text" type="string"/> +  </complexType> + +  <complexType name="root_type"> +    <sequence> +      <element name="object" type="object_type"/> +      <element name="reference" type="IDREF"/> +    </sequence> +  </complexType> + +  <element name="root" type="root_type"/> +</schema> +  </pre> + +  <p>The <code>ref</code> instance in the code below will refer to +     an object of type <code>object_type</code>:</p> + +  <pre class="c++"> +root_type& root = ...; +xml_schema::idref& ref (root.reference ()); +object_type& obj (dynamic_cast<object_type&> (*ref)); +cout << obj.text () << endl; +  </pre> + +  <p>The smart pointer interface of the <code>idref</code> class always +     returns a pointer or reference to <code>xml_schema::type</code>. +     This means that you will need to manually cast such pointer or +     reference to its real (dynamic) type before you can use it (unless +     all you need is the base interface provided by +     <code>xml_schema::type</code>). As a special extension to the XML +     Schema language, the mapping supports static typing of <code>idref</code> +     references by employing the <code>refType</code> extension attribute. +     The following example illustrates this mechanism: +  </p> + +  <pre class="xml"> +<!-- test.xsd --> +<schema +  xmlns:xse="http://www.codesynthesis.com/xmlns/xml-schema-extension"> + +  ... + +      <element name="reference" type="IDREF" xse:refType="object_type"/> + +  ... + +</schema> +  </pre> + +  <p>With this modification we do not need to do manual casting anymore: +  </p> + +  <pre class="c++"> +root_type& root = ...; +root_type::reference_type& ref (root.reference ()); +object_type& obj (*ref); +cout << ref->text () << endl; +  </pre> + + +  <h3><a name="2.5.6">2.5.6 Mapping for <code>base64Binary</code> and +      <code>hexBinary</code></a></h3> + +  <p>The XML Schema <code>base64Binary</code> and <code>hexBinary</code> +     built-in data types are mapped to the +     <code>xml_schema::base64_binary</code> and +     <code>xml_schema::hex_binary</code> C++ classes, respectively. The +     <code>base64_binary</code> and <code>hex_binary</code> classes +     support a simple buffer abstraction by inheriting from the +     <code>xml_schema::buffer</code> class: +  </p> + +  <pre class="c++"> +class bounds: public virtual exception +{ +public: +  virtual const char* +  what () const throw (); +}; + +class buffer +{ +public: +  typedef std::size_t size_t; + +public: +  buffer (size_t size = 0); +  buffer (size_t size, size_t capacity); +  buffer (const void* data, size_t size); +  buffer (const void* data, size_t size, size_t capacity); +  buffer (void* data, +          size_t size, +          size_t capacity, +          bool assume_ownership); + +public: +  buffer (const buffer&); + +  buffer& +  operator= (const buffer&); + +  void +  swap (buffer&); + +public: +  size_t +  capacity () const; + +  bool +  capacity (size_t); + +public: +  size_t +  size () const; + +  bool +  size (size_t); + +public: +  const char* +  data () const; + +  char* +  data (); + +  const char* +  begin () const; + +  char* +  begin (); + +  const char* +  end () const; + +  char* +  end (); +}; +  </pre> + +  <p>The last overloaded constructor reuses an existing data buffer instead +     of making a copy. If the <code>assume_ownership</code> argument is +     <code>true</code>, the instance assumes ownership of the +     memory block pointed to by the <code>data</code> argument and will +     eventually release it by calling <code>operator delete</code>. The +     <code>capacity</code> and <code>size</code> modifier functions return +     <code>true</code> if the underlying buffer has moved. +  </p> + +  <p>The <code>bounds</code> exception is thrown if the constructor +     arguments violate the <code>(size <= capacity)</code> +     constraint.</p> + +  <p>The <code>base64_binary</code> and <code>hex_binary</code> classes +     support the <code>buffer</code> interface and perform automatic +     decoding/encoding from/to the Base64 and Hex formats, respectively: +  </p> + +  <pre class="c++"> +class base64_binary: public simple_type, public buffer +{ +public: +  base64_binary (size_t size = 0); +  base64_binary (size_t size, size_t capacity); +  base64_binary (const void* data, size_t size); +  base64_binary (const void* data, size_t size, size_t capacity); +  base64_binary (void* data, +                 size_t size, +                 size_t capacity, +                 bool assume_ownership); + +public: +  base64_binary (const base64_binary&); + +  base64_binary& +  operator= (const base64_binary&); + +  virtual base64_binary* +  _clone () const; + +public: +  std::basic_string<C> +  encode () const; +}; +  </pre> + +  <pre class="c++"> +class hex_binary: public simple_type, public buffer +{ +public: +  hex_binary (size_t size = 0); +  hex_binary (size_t size, size_t capacity); +  hex_binary (const void* data, size_t size); +  hex_binary (const void* data, size_t size, size_t capacity); +  hex_binary (void* data, +              size_t size, +              size_t capacity, +              bool assume_ownership); + +public: +  hex_binary (const hex_binary&); + +  hex_binary& +  operator= (const hex_binary&); + +  virtual hex_binary* +  _clone () const; + +public: +  std::basic_string<C> +  encode () const; +}; +  </pre> + + +  <h2><a name="2.5.7">2.5.7 Time Zone Representation</a></h2> + +  <p>The <code>date</code>, <code>dateTime</code>, <code>gDay</code>, +     <code>gMonth</code>, <code>gMonthDay</code>, <code>gYear</code>, +     <code>gYearMonth</code>, and <code>time</code> XML Schema built-in +     types all include an optional time zone component. The following +     <code>xml_schema::time_zone</code> base class is used to represent +     this information:</p> + +  <pre class="c++"> +class time_zone +{ +public: +  time_zone (); +  time_zone (short hours, short minutes); + +  bool +  zone_present () const; + +  void +  zone_reset (); + +  short +  zone_hours () const; + +  void +  zone_hours (short); + +  short +  zone_minutes () const; + +  void +  zone_minutes (short); +}; + +bool +operator== (const time_zone&, const time_zone&); + +bool +operator!= (const time_zone&, const time_zone&); +  </pre> + +  <p>The <code>zone_present()</code> accessor function returns <code>true</code> +     if the time zone is specified. The <code>zone_reset()</code> modifier +     function resets the time zone object to the <em>not specified</em> +     state. If the time zone offset is negative then both hours and +     minutes components are represented as negative integers.</p> + + +  <h2><a name="2.5.8">2.5.8 Mapping for <code>date</code></a></h2> + + <p>The XML Schema <code>date</code> built-in data type is mapped to the +    <code>xml_schema::date</code> C++ class which represents a year, a day, +    and a month with an optional time zone. Its interface is presented +    below. For more information on the base <code>xml_schema::time_zone</code> +    class refer to <a href="#2.5.7">Section 2.5.7, "Time Zone +    Representation"</a>.</p> + +  <pre class="c++"> +class date: public simple_type, public time_zone +{ +public: +  date (int year, unsigned short month, unsigned short day); +  date (int year, unsigned short month, unsigned short day, +        short zone_hours, short zone_minutes); + +public: +  date (const date&); + +  date& +  operator= (const date&); + +  virtual date* +  _clone () const; + +public: +  int +  year () const; + +  void +  year (int); + +  unsigned short +  month () const; + +  void +  month (unsigned short); + +  unsigned short +  day () const; + +  void +  day (unsigned short); +}; + +bool +operator== (const date&, const date&); + +bool +operator!= (const date&, const date&); +  </pre> + +  <h2><a name="2.5.9">2.5.9 Mapping for <code>dateTime</code></a></h2> + + <p>The XML Schema <code>dateTime</code> built-in data type is mapped to the +    <code>xml_schema::date_time</code> C++ class which represents a year, a month, +    a day, hours, minutes, and seconds with an optional time zone. Its interface +    is presented below. For more information on the base +    <code>xml_schema::time_zone</code> class refer to <a href="#2.5.7">Section +    2.5.7, "Time Zone Representation"</a>.</p> + +  <pre class="c++"> +class date_time: public simple_type, public time_zone +{ +public: +  date_time (int year, unsigned short month, unsigned short day, +             unsigned short hours, unsigned short minutes, +             double seconds); + +  date_time (int year, unsigned short month, unsigned short day, +             unsigned short hours, unsigned short minutes, +             double seconds, short zone_hours, short zone_minutes); +public: +  date_time (const date_time&); + +  date_time& +  operator= (const date_time&); + +  virtual date_time* +  _clone () const; + +public: +  int +  year () const; + +  void +  year (int); + +  unsigned short +  month () const; + +  void +  month (unsigned short); + +  unsigned short +  day () const; + +  void +  day (unsigned short); + +  unsigned short +  hours () const; + +  void +  hours (unsigned short); + +  unsigned short +  minutes () const; + +  void +  minutes (unsigned short); + +  double +  seconds () const; + +  void +  seconds (double); +}; + +bool +operator== (const date_time&, const date_time&); + +bool +operator!= (const date_time&, const date_time&); +  </pre> + + +  <h2><a name="2.5.10">2.5.10 Mapping for <code>duration</code></a></h2> + +  <p>The XML Schema <code>duration</code> built-in data type is mapped to the +    <code>xml_schema::duration</code> C++ class which represents a potentially +     negative duration in the form of years, months, days, hours, minutes, +     and seconds. Its interface is presented below.</p> + +  <pre class="c++"> +class duration: public simple_type +{ +public: +  duration (bool negative, +            unsigned int years, unsigned int months, unsigned int days, +            unsigned int hours, unsigned int minutes, double seconds); +public: +  duration (const duration&); + +  duration& +  operator= (const duration&); + +  virtual duration* +  _clone () const; + +public: +  bool +  negative () const; + +  void +  negative (bool); + +  unsigned int +  years () const; + +  void +  years (unsigned int); + +  unsigned int +  months () const; + +  void +  months (unsigned int); + +  unsigned int +  days () const; + +  void +  days (unsigned int); + +  unsigned int +  hours () const; + +  void +  hours (unsigned int); + +  unsigned int +  minutes () const; + +  void +  minutes (unsigned int); + +  double +  seconds () const; + +  void +  seconds (double); +}; + +bool +operator== (const duration&, const duration&); + +bool +operator!= (const duration&, const duration&); +  </pre> + + +  <h2><a name="2.5.11">2.5.11 Mapping for <code>gDay</code></a></h2> + +  <p>The XML Schema <code>gDay</code> built-in data type is mapped to the +    <code>xml_schema::gday</code> C++ class which represents a day of the +     month with an optional time zone. Its interface is presented below. +     For more information on the base <code>xml_schema::time_zone</code> +     class refer to <a href="#2.5.7">Section 2.5.7, "Time Zone +     Representation"</a>.</p> + +  <pre class="c++"> +class gday: public simple_type, public time_zone +{ +public: +  explicit +  gday (unsigned short day); +  gday (unsigned short day, short zone_hours, short zone_minutes); + +public: +  gday (const gday&); + +  gday& +  operator= (const gday&); + +  virtual gday* +  _clone () const; + +public: +  unsigned short +  day () const; + +  void +  day (unsigned short); +}; + +bool +operator== (const gday&, const gday&); + +bool +operator!= (const gday&, const gday&); +  </pre> + + +  <h2><a name="2.5.12">2.5.12 Mapping for <code>gMonth</code></a></h2> + +  <p>The XML Schema <code>gMonth</code> built-in data type is mapped to the +    <code>xml_schema::gmonth</code> C++ class which represents a month of the +     year with an optional time zone. Its interface is presented below. +     For more information on the base <code>xml_schema::time_zone</code> +     class refer to <a href="#2.5.7">Section 2.5.7, "Time Zone +     Representation"</a>.</p> + +  <pre class="c++"> +class gmonth: public simple_type, public time_zone +{ +public: +  explicit +  gmonth (unsigned short month); +  gmonth (unsigned short month, +          short zone_hours, short zone_minutes); + +public: +  gmonth (const gmonth&); + +  gmonth& +  operator= (const gmonth&); + +  virtual gmonth* +  _clone () const; + +public: +  unsigned short +  month () const; + +  void +  month (unsigned short); +}; + +bool +operator== (const gmonth&, const gmonth&); + +bool +operator!= (const gmonth&, const gmonth&); +  </pre> + + +  <h2><a name="2.5.13">2.5.13 Mapping for <code>gMonthDay</code></a></h2> + +  <p>The XML Schema <code>gMonthDay</code> built-in data type is mapped to the +    <code>xml_schema::gmonth_day</code> C++ class which represents a day and +     a month of the year with an optional time zone. Its interface is presented +     below. For more information on the base <code>xml_schema::time_zone</code> +     class refer to <a href="#2.5.7">Section 2.5.7, "Time Zone +     Representation"</a>.</p> + +  <pre class="c++"> +class gmonth_day: public simple_type, public time_zone +{ +public: +  gmonth_day (unsigned short month, unsigned short day); +  gmonth_day (unsigned short month, unsigned short day, +              short zone_hours, short zone_minutes); + +public: +  gmonth_day (const gmonth_day&); + +  gmonth_day& +  operator= (const gmonth_day&); + +  virtual gmonth_day* +  _clone () const; + +public: +  unsigned short +  month () const; + +  void +  month (unsigned short); + +  unsigned short +  day () const; + +  void +  day (unsigned short); +}; + +bool +operator== (const gmonth_day&, const gmonth_day&); + +bool +operator!= (const gmonth_day&, const gmonth_day&); +  </pre> + + +  <h2><a name="2.5.14">2.5.14 Mapping for <code>gYear</code></a></h2> + +  <p>The XML Schema <code>gYear</code> built-in data type is mapped to the +    <code>xml_schema::gyear</code> C++ class which represents a year with +     an optional time zone. Its interface is presented below. For more +     information on the base <code>xml_schema::time_zone</code> class refer +     to <a href="#2.5.7">Section 2.5.7, "Time Zone Representation"</a>.</p> + +  <pre class="c++"> +class gyear: public simple_type, public time_zone +{ +public: +  explicit +  gyear (int year); +  gyear (int year, short zone_hours, short zone_minutes); + +public: +  gyear (const gyear&); + +  gyear& +  operator= (const gyear&); + +  virtual gyear* +  _clone () const; + +public: +  int +  year () const; + +  void +  year (int); +}; + +bool +operator== (const gyear&, const gyear&); + +bool +operator!= (const gyear&, const gyear&); +  </pre> + + +  <h2><a name="2.5.15">2.5.15 Mapping for <code>gYearMonth</code></a></h2> + +  <p>The XML Schema <code>gYearMonth</code> built-in data type is mapped to +     the <code>xml_schema::gyear_month</code> C++ class which represents +     a year and a month with an optional time zone. Its interface is presented +     below. For more information on the base <code>xml_schema::time_zone</code> +     class refer to <a href="#2.5.7">Section 2.5.7, "Time Zone +     Representation"</a>.</p> + +  <pre class="c++"> +class gyear_month: public simple_type, public time_zone +{ +public: +  gyear_month (int year, unsigned short month); +  gyear_month (int year, unsigned short month, +               short zone_hours, short zone_minutes); +public: +  gyear_month (const gyear_month&); + +  gyear_month& +  operator= (const gyear_month&); + +  virtual gyear_month* +  _clone () const; + +public: +  int +  year () const; + +  void +  year (int); + +  unsigned short +  month () const; + +  void +  month (unsigned short); +}; + +bool +operator== (const gyear_month&, const gyear_month&); + +bool +operator!= (const gyear_month&, const gyear_month&); +  </pre> + + +  <h2><a name="2.5.16">2.5.16 Mapping for <code>time</code></a></h2> + +  <p>The XML Schema <code>time</code> built-in data type is mapped to +     the <code>xml_schema::time</code> C++ class which represents hours, +     minutes, and seconds with an optional time zone. Its interface is +     presented below. For more information on the base +     <code>xml_schema::time_zone</code> class refer to +     <a href="#2.5.7">Section 2.5.7, "Time Zone Representation"</a>.</p> + +  <pre class="c++"> +class time: public simple_type, public time_zone +{ +public: +  time (unsigned short hours, unsigned short minutes, double seconds); +  time (unsigned short hours, unsigned short minutes, double seconds, +        short zone_hours, short zone_minutes); + +public: +  time (const time&); + +  time& +  operator= (const time&); + +  virtual time* +  _clone () const; + +public: +  unsigned short +  hours () const; + +  void +  hours (unsigned short); + +  unsigned short +  minutes () const; + +  void +  minutes (unsigned short); + +  double +  seconds () const; + +  void +  seconds (double); +}; + +bool +operator== (const time&, const time&); + +bool +operator!= (const time&, const time&); +  </pre> + + +  <!-- Mapping for Simple Types --> + +  <h2><a name="2.6">2.6 Mapping for Simple Types</a></h2> + +  <p>An XML Schema simple type is mapped to a C++ class with the same +     name as the simple type. The class defines a public copy constructor, +     a public copy assignment operator, and a public virtual +     <code>_clone</code> function. The <code>_clone</code> function is +     declared <code>const</code>, does not take any arguments, and returns +     a pointer to a complete copy of the instance allocated in the free +     store. The <code>_clone</code> function shall be used to make copies +     when static type and dynamic type of the instance may differ (see +     <a href="#2.11">Section 2.11, "Mapping for <code>xsi:type</code> +     and Substitution Groups"</a>). For instance:</p> + +  <pre class="xml"> +<simpleType name="object"> +  ... +</simpleType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: ... +{ +public: +  object (const object&); + +public: +  object& +  operator= (const object&); + +public: +  virtual object* +  _clone () const; + +  ... + +}; +  </pre> + +  <p>The base class specification and the rest of the class definition +     depend on the type of derivation used to define the simple type. </p> + + +  <h3><a name="2.6.1">2.6.1 Mapping for Derivation by Restriction</a></h3> + +  <p>XML Schema derivation by restriction is mapped to C++ public +     inheritance. The base type of the restriction becomes the base +     type for the resulting C++ class. In addition to the members described +     in <a href="#2.6">Section 2.6, "Mapping for Simple Types"</a>, the +     resulting C++ class defines a public constructor with the base type +     as its single argument. For instance:</p> + +  <pre class="xml"> +<simpleType name="object"> +  <restriction base="base"> +    ... +  </restriction> +</simpleType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public base +{ +public: +  object (const base&); +  object (const object&); + +public: +  object& +  operator= (const object&); + +public: +  virtual object* +  _clone () const; +}; +  </pre> + + +  <h3><a name="2.6.2">2.6.2 Mapping for Enumerations</a></h3> + +<p>XML Schema restriction by enumeration is mapped to a C++ class +   with semantics similar to C++ <code>enum</code>. Each XML Schema +   enumeration element is mapped to a C++ enumerator with the +   name derived from the <code>value</code> attribute and defined +   in the class scope. In addition to the members +   described in <a href="#2.6">Section 2.6, "Mapping for Simple Types"</a>, +   the resulting C++ class defines a public constructor that can be called +   with one of the enumerators as its single argument, a public constructor +   that can be called with enumeration's base value as its single +   argument, a public assignment operator that can be used to assign the +   value of one of the enumerators, and a public implicit conversion +   operator to the underlying C++ enum type.</p> + +<p>Furthermore, for string-based enumeration types, the resulting C++ +   class defines a public constructor with a single argument of type +   <code>const C*</code> and a public constructor with a single +   argument of type <code>const std::basic_string<C>&</code>. +   For instance:</p> + +  <pre class="xml"> +<simpleType name="color"> +  <restriction base="string"> +    <enumeration value="red"/> +    <enumeration value="green"/> +    <enumeration value="blue"/> +  </restriction> +</simpleType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class color: public xml_schema::string +{ +public: +  enum value +  { +    red, +    green, +    blue +  }; + +public: +  color (value); +  color (const C*); +  color (const std::basic_string<C>&); +  color (const xml_schema::string&); +  color (const color&); + +public: +  color& +  operator= (value); + +  color& +  operator= (const color&); + +public: +  virtual color* +  _clone () const; + +public: +  operator value () const; +}; +  </pre> + +  <h3><a name="2.6.3">2.6.3 Mapping for Derivation by List</a></h3> + +  <p>XML Schema derivation by list is mapped to C++ public +     inheritance from <code>xml_schema::simple_type</code> +     (<a href="#2.5.3">Section 2.5.3, "Mapping for +     <code>anySimpleType</code>"</a>) and a suitable sequence type. +     The list item type becomes the element type of the sequence. +     In addition to the members described in <a href="#2.6">Section 2.6, +     "Mapping for Simple Types"</a>, the resulting C++ class defines +     a public default constructor, a public constructor +     with the first argument of type <code>size_type</code> and +     the second argument of list item type that creates +     a list object with the specified number of copies of the specified +     element value, and a public constructor with the two arguments +     of an input iterator type that creates a list object from an +     iterator range. For instance: +  </p> + +  <pre class="xml"> +<simpleType name="int_list"> +  <list itemType="int"/> +</simpleType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class int_list: public simple_type, +                public sequence<int> +{ +public: +  int_list (); +  int_list (size_type n, int x); + +  template <typename I> +  int_list (const I& begin, const I& end); +  int_list (const int_list&); + +public: +  int_list& +  operator= (const int_list&); + +public: +  virtual int_list* +  _clone () const; +}; +  </pre> + +  <p>The <code>sequence</code> class template is defined in an +     implementation-specific namespace. It conforms to the +     sequence interface as defined by the ISO/ANSI Standard for +     C++ (ISO/IEC 14882:1998, Section 23.1.1, "Sequences"). +     Practically, this means that you can treat such a sequence +     as if it was <code>std::vector</code>. One notable extension +     to the standard interface that is available only for +     sequences of non-fundamental C++ types is the addition of +     the overloaded <code>push_back</code> and <code>insert</code> +     member functions which instead of the constant reference +     to the element type accept automatic pointer (<code>std::auto_ptr</code> +     or <code>std::unique_ptr</code>, depending on the C++ standard +     selected) to the element type. These functions assume ownership +     of the pointed to object and reset the passed automatic pointer. +  </p> + +  <h3><a name="2.6.4">2.6.4 Mapping for Derivation by Union</a></h3> + +  <p>XML Schema derivation by union is mapped to C++ public +     inheritance from <code>xml_schema::simple_type</code> +     (<a href="#2.5.3">Section 2.5.3, "Mapping for +     <code>anySimpleType</code>"</a>) and <code>std::basic_string<C></code>. +     In addition to the members described in <a href="#2.6">Section 2.6, +     "Mapping for Simple Types"</a>, the resulting C++ class defines a +     public constructor with a single argument of type <code>const C*</code> +     and a public constructor with a single argument of type +     <code>const std::basic_string<C>&</code>. For instance: +  </p> + +  <pre class="xml"> +<simpleType name="int_string_union"> +  <xsd:union memberTypes="xsd:int xsd:string"/> +</simpleType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class int_string_union: public simple_type, +                        public std::basic_string<C> +{ +public: +  int_string_union (const C*); +  int_string_union (const std::basic_string<C>&); +  int_string_union (const int_string_union&); + +public: +  int_string_union& +  operator= (const int_string_union&); + +public: +  virtual int_string_union* +  _clone () const; +}; +  </pre> + +  <h2><a name="2.7">2.7 Mapping for Complex Types</a></h2> + +  <p>An XML Schema complex type is mapped to a C++ class with the same +     name as the complex type. The class defines a public copy constructor, +     a public copy assignment operator, and a public virtual +     <code>_clone</code> function. The <code>_clone</code> function is +     declared <code>const</code>, does not take any arguments, and returns +     a pointer to a complete copy of the instance allocated in the free +     store. The <code>_clone</code> function shall be used to make copies +     when static type and dynamic type of the instance may differ (see +     <a href="#2.11">Section 2.11, "Mapping for <code>xsi:type</code> +     and Substitution Groups"</a>).</p> + +  <p>Additionally, the resulting C++ class +     defines two public constructors that take an initializer for each +     member of the complex type and all its base types that belongs to +     the One cardinality class (see <a href="#2.8">Section 2.8, "Mapping +     for Local Elements and Attributes"</a>). In the first constructor, +     the arguments are passed as constant references and the newly created +     instance is initialized with copies of the passed objects. In the +     second constructor, arguments that are complex types (that is, +     they themselves contain elements or attributes) are passed as +     either <code>std::auto_ptr</code> (C++98) or <code>std::unique_ptr</code> +     (C++11), depending on the C++ standard selected. In this case the newly +     created instance is directly initialized with and assumes ownership +     of the pointed to objects and the <code>std::[auto|unique]_ptr</code> +     arguments are reset to <code>0</code>. For instance:</p> + +  <pre class="xml"> +<complexType name="complex"> +  <sequence> +    <element name="a" type="int"/> +    <element name="b" type="string"/> +  </sequence> +</complexType> + +<complexType name="object"> +  <sequence> +    <element name="s-one" type="boolean"/> +    <element name="c-one" type="complex"/> +    <element name="optional" type="int" minOccurs="0"/> +    <element name="sequence" type="string" maxOccurs="unbounded"/> +  </sequence> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class complex: public xml_schema::type +{ +public: +  object (const int& a, const xml_schema::string& b); +  object (const complex&); + +public: +  object& +  operator= (const complex&); + +public: +  virtual complex* +  _clone () const; + +  ... + +}; + +class object: public xml_schema::type +{ +public: +  object (const bool& s_one, const complex& c_one); +  object (const bool& s_one, std::[auto|unique]_ptr<complex> c_one); +  object (const object&); + +public: +  object& +  operator= (const object&); + +public: +  virtual object* +  _clone () const; + +  ... + +}; +  </pre> + +  <p>Notice that the generated <code>complex</code> class does not +     have the second (<code>std::[auto|unique]_ptr</code>) version of the +     constructor since all its required members are of simple types.</p> + +  <p>If an XML Schema complex type has an ultimate base which is an XML +     Schema simple type then the resulting C++ class also defines a public +     constructor that takes an initializer for the base type as well as +     for each member of the complex type and all its base types that +     belongs to the One cardinality class. For instance:</p> + +  <pre class="xml"> +<complexType name="object"> +  <simpleContent> +    <extension base="date"> +      <attribute name="lang" type="language" use="required"/> +    </extension> +  </simpleContent> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::string +{ +public: +  object (const xml_schema::language& lang); + +  object (const xml_schema::date& base, +          const xml_schema::language& lang); + +  ... + +}; +  </pre> + +  <p>Furthermore, for string-based XML Schema complex types, the resulting C++ +     class also defines two  public constructors with the first arguments +     of type <code>const C*</code> and <code>std::basic_string<C>&</code>, +     respectively, followed by arguments for each member of the complex +     type and all its base types that belongs to the One cardinality +     class. For enumeration-based complex types the resulting C++ +     class also defines a public constructor with the first arguments +     of the underlying enum type followed by arguments for each member +     of the complex type and all its base types that belongs to the One +     cardinality class. For instance:</p> + +  <pre class="xml"> +<simpleType name="color"> +  <restriction base="string"> +    <enumeration value="red"/> +    <enumeration value="green"/> +    <enumeration value="blue"/> +  </restriction> +</simpleType> + +<complexType name="object"> +  <simpleContent> +    <extension base="color"> +      <attribute name="lang" type="language" use="required"/> +    </extension> +  </simpleContent> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class color: public xml_schema::string +{ +public: +  enum value +  { +    red, +    green, +    blue +  }; + +public: +  color (value); +  color (const C*); +  color (const std::basic_string<C>&); + +  ... + +}; + +class object: color +{ +public: +  object (const color& base, +          const xml_schema::language& lang); + +  object (const color::value& base, +          const xml_schema::language& lang); + +  object (const C* base, +          const xml_schema::language& lang); + +  object (const std::basic_string<C>& base, +          const xml_schema::language& lang); + +  ... + +}; +  </pre> + +  <p>Additional constructors can be requested with the +     <code>--generate-default-ctor</code> and +     <code>--generate-from-base-ctor</code> options. See the +     <a href="http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml">XSD +     Compiler Command Line Manual</a> for details.</p> + +  <p>If an XML Schema complex type is not explicitly derived from any type, +     the resulting C++ class is derived from <code>xml_schema::type</code>. +     In cases where an XML Schema complex type is defined using derivation +     by extension or restriction, the resulting C++ base class specification +     depends on the type of derivation and is described in the subsequent +     sections. +  </p> + +  <p>The mapping for elements and attributes that are defined in a complex +     type is described in <a href="#2.8">Section 2.8, "Mapping for Local +     Elements and Attributes"</a>. +  </p> + +  <h3><a name="2.7.1">2.7.1 Mapping for Derivation by Extension</a></h3> + +  <p>XML Schema derivation by extension is mapped to C++ public +     inheritance. The base type of the extension becomes the base +     type for the resulting C++ class. +  </p> + +  <h3><a name="2.7.2">2.7.2 Mapping for Derivation by Restriction</a></h3> + +  <p>XML Schema derivation by restriction is mapped to C++ public +     inheritance. The base type of the restriction becomes the base +     type for the resulting C++ class. XML Schema elements and +     attributes defined within restriction do not result in any +     definitions in the resulting C++ class. Instead, corresponding +     (unrestricted) definitions are inherited from the base class. +     In the future versions of this mapping, such elements and +     attributes may result in redefinitions of accessors and +     modifiers to reflect their restricted semantics. +  </p> + +  <!-- 2.8 Mapping for Local Elements and Attributes --> + +  <h2><a name="2.8">2.8 Mapping for Local Elements and Attributes</a></h2> + +   <p>XML Schema element and attribute definitions are called local +      if they appear within a complex type definition, an element group +      definition, or an attribute group definitions. +   </p> + +   <p>Local XML Schema element and attribute definitions have the same +      C++ mapping. Therefore, in this section, local elements and +      attributes are collectively called members. +   </p> + +   <p>While there are many different member cardinality combinations +      (determined by the <code>use</code> attribute for attributes and +       the <code>minOccurs</code> and <code>maxOccurs</code> attributes +       for elements), the mapping divides all possible cardinality +       combinations into three cardinality classes: +   </p> + +   <dl> +     <dt><i>one</i></dt> +     <dd>attributes: <code>use == "required"</code></dd> +     <dd>attributes: <code>use == "optional"</code> and has default or fixed value</dd> +     <dd>elements: <code>minOccurs == "1"</code> and <code>maxOccurs == "1"</code></dd> + +     <dt><i>optional</i></dt> +     <dd>attributes: <code>use == "optional"</code> and doesn't have default or fixed value</dd> +     <dd>elements: <code>minOccurs == "0"</code> and <code>maxOccurs == "1"</code></dd> + +     <dt><i>sequence</i></dt> +     <dd>elements: <code>maxOccurs > "1"</code></dd> +   </dl> + +   <p>An optional attribute with a default or fixed value acquires this value +      if the attribute hasn't been specified in an instance document (see +      <a href="#A">Appendix A, "Default and Fixed Values"</a>). This +      mapping places such optional attributes to the One cardinality +      class.</p> + +   <p>A member is mapped to a set of public type definitions +      (<code>typedef</code>s) and a set of public accessor and modifier +      functions. Type definitions have names derived from the member's +      name. The accessor and modifier functions have the same name as the +      member. For example: +   </p> + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    <element name="member" type="string"/> +  </sequence> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  typedef xml_schema::string member_type; + +  const member_type& +  member () const; + +  ... + +}; +  </pre> + +   <p>In addition, if a member has a default or fixed value, a static +      accessor function is generated that returns this value. For +      example:</p> + +<pre class="xml"> +<complexType name="object"> +  <attribute name="data" type="string" default="test"/> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  typedef xml_schema::string data_type; + +  const data_type& +  data () const; + +  static const data_type& +  data_default_value (); + +  ... + +}; +  </pre> + +   <p>Names and semantics of type definitions for the member as well +      as signatures of the accessor and modifier functions depend on +      the member's cardinality class and are described in the following +      sub-sections. +   </p> + + +  <h3><a name="2.8.1">2.8.1 Mapping for Members with the One Cardinality Class</a></h3> + +   <p>For the One cardinality class, the type definitions consist of +      an alias for the member's type with the name created by appending +      the <code>_type</code> suffix to the member's name. +   </p> + +   <p>The accessor functions come in constant and non-constant versions. +      The constant accessor function returns a constant reference to the +      member and can be used for read-only access. The non-constant +      version returns an unrestricted reference to the member and can +      be used for read-write access. +   </p> + +   <p>The first modifier function expects an argument of type reference to +      constant of the member's type. It makes a deep copy of its argument. +      Except for member's types that are mapped to fundamental C++ types, +      the second modifier function is provided that expects an argument +      of type automatic pointer (<code>std::auto_ptr</code> or +      <code>std::unique_ptr</code>, depending on the C++ standard selected) +      to the member's type. It assumes ownership of the pointed to object +      and resets the passed automatic pointer. For instance:</p> + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    <element name="member" type="string"/> +  </sequence> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef xml_schema::string member_type; + +  // Accessors. +  // +  const member_type& +  member () const; + +  member_type& +  member (); + +  // Modifiers. +  // +  void +  member (const member_type&); + +  void +  member (std::[auto|unique]_ptr<member_type>); +  ... + +}; +  </pre> + +   <p>In addition, if requested by specifying the <code>--generate-detach</code> +      option and only for members of non-fundamental C++ types, the mapping +      provides a detach function that returns an automatic pointer to the +      member's type, for example:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  ... + +  std::[auto|unique]_ptr<member_type> +  detach_member (); +  ... + +}; +  </pre> + +   <p>This function detaches the value from the tree leaving the member +      value uninitialized. Accessing such an uninitialized value prior to +      re-initializing it results in undefined behavior.</p> + +  <p>The following code shows how one could use this mapping:</p> + +  <pre class="c++"> +void +f (object& o) +{ +  using xml_schema::string; + +  string s (o.member ());                // get +  object::member_type& sr (o.member ()); // get + +  o.member ("hello");           // set, deep copy +  o.member () = "hello";        // set, deep copy + +  // C++98 version. +  // +  std::auto_ptr<string> p (new string ("hello")); +  o.member (p);                 // set, assumes ownership +  p = o.detach_member ();       // detach, member is uninitialized +  o.member (p);                 // re-attach + +  // C++11 version. +  // +  std::unique_ptr<string> p (new string ("hello")); +  o.member (std::move (p));     // set, assumes ownership +  p = o.detach_member ();       // detach, member is uninitialized +  o.member (std::move (p));     // re-attach +} +  </pre> + + +<h3><a name="2.8.2">2.8.2 Mapping for Members with the Optional Cardinality Class</a></h3> + +   <p>For the Optional cardinality class, the type definitions consist of +      an alias for the member's type with the name created by appending +      the <code>_type</code> suffix to the member's name and an alias for +      the container type with the name created by appending the +      <code>_optional</code> suffix to the member's name. +   </p> + +   <p>Unlike accessor functions for the One cardinality class, accessor +      functions for the Optional cardinality class return references to +      corresponding containers rather than directly to members. The +      accessor functions come in constant and non-constant versions. +      The constant accessor function returns a constant reference to +      the container and can be used for read-only access. The non-constant +      version returns an unrestricted reference to the container +      and can be used for read-write access. +   </p> + +   <p>The modifier functions are overloaded for the member's +      type and the container type. The first modifier function +      expects an argument of type reference to constant of the +      member's type. It makes a deep copy of its argument. +      Except for member's types that are mapped to fundamental C++ types, +      the second modifier function is provided that expects an argument +      of type automatic pointer (<code>std::auto_ptr</code> or +      <code>std::unique_ptr</code>, depending on the C++ standard selected) +      to the member's type. It assumes ownership of the pointed to object +      and resets the passed automatic pointer. The last modifier function +      expects an argument of type reference to constant of the container +      type. It makes a deep copy of its argument. For instance: +   </p> + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    <element name="member" type="string" minOccurs="0"/> +  </sequence> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef xml_schema::string member_type; +  typedef optional<member_type> member_optional; + +  // Accessors. +  // +  const member_optional& +  member () const; + +  member_optional& +  member (); + +  // Modifiers. +  // +  void +  member (const member_type&); + +  void +  member (std::[auto|unique]_ptr<member_type>); + +  void +  member (const member_optional&); + +  ... + +}; +  </pre> + + +  <p>The <code>optional</code> class template is defined in an +     implementation-specific namespace and has the following +     interface. The <code>[auto|unique]_ptr</code>-based constructor +     and modifier function are only available if the template +     argument is not a fundamental C++ type. +  </p> + +  <pre class="c++"> +template <typename X> +class optional +{ +public: +  optional (); + +  // Makes a deep copy. +  // +  explicit +  optional (const X&); + +  // Assumes ownership. +  // +  explicit +  optional (std::[auto|unique]_ptr<X>); + +  optional (const optional&); + +public: +  optional& +  operator= (const X&); + +  optional& +  operator= (const optional&); + +  // Pointer-like interface. +  // +public: +  const X* +  operator-> () const; + +  X* +  operator-> (); + +  const X& +  operator* () const; + +  X& +  operator* (); + +  typedef void (optional::*bool_convertible) (); +  operator bool_convertible () const; + +  // Get/set interface. +  // +public: +  bool +  present () const; + +  const X& +  get () const; + +  X& +  get (); + +  // Makes a deep copy. +  // +  void +  set (const X&); + +  // Assumes ownership. +  // +  void +  set (std::[auto|unique]_ptr<X>); + +  // Detach and return the contained value. +  // +  std::[auto|unique]_ptr<X> +  detach (); + +  void +  reset (); +}; + +template <typename X> +bool +operator== (const optional<X>&, const optional<X>&); + +template <typename X> +bool +operator!= (const optional<X>&, const optional<X>&); + +template <typename X> +bool +operator< (const optional<X>&, const optional<X>&); + +template <typename X> +bool +operator> (const optional<X>&, const optional<X>&); + +template <typename X> +bool +operator<= (const optional<X>&, const optional<X>&); + +template <typename X> +bool +operator>= (const optional<X>&, const optional<X>&); +  </pre> + + +  <p>The following code shows how one could use this mapping:</p> + +  <pre class="c++"> +void +f (object& o) +{ +  using xml_schema::string; + +  if (o.member ().present ())       // test +  { +    string& s (o.member ().get ()); // get +    o.member ("hello");             // set, deep copy +    o.member ().set ("hello");      // set, deep copy +    o.member ().reset ();           // reset +  } + +  // Same as above but using pointer notation: +  // +  if (o.member ())                  // test +  { +    string& s (*o.member ());       // get +    o.member ("hello");             // set, deep copy +    *o.member () = "hello";         // set, deep copy +    o.member ().reset ();           // reset +  } + +  // C++98 version. +  // +  std::auto_ptr<string> p (new string ("hello")); +  o.member (p);                     // set, assumes ownership + +  p = new string ("hello"); +  o.member ().set (p);              // set, assumes ownership + +  p = o.member ().detach ();        // detach, member is reset +  o.member ().set (p);              // re-attach + +  // C++11 version. +  // +  std::unique_ptr<string> p (new string ("hello")); +  o.member (std::move (p));         // set, assumes ownership + +  p.reset (new string ("hello")); +  o.member ().set (std::move (p));  // set, assumes ownership + +  p = o.member ().detach ();        // detach, member is reset +  o.member ().set (std::move (p));  // re-attach +} +  </pre> + + +  <h3><a name="2.8.3">2.8.3 Mapping for Members with the Sequence Cardinality Class</a></h3> + +   <p>For the Sequence cardinality class, the type definitions consist of an +      alias for the member's type with the name created by appending +      the <code>_type</code> suffix to the member's name, an alias of +      the container type with the name created by appending the +      <code>_sequence</code> suffix to the member's name, an alias of +      the iterator type with the name created by appending the +      <code>_iterator</code> suffix to the member's name, and an alias +      of the constant iterator type with the name created by appending the +      <code>_const_iterator</code> suffix to the member's name. +   </p> + +   <p>The accessor functions come in constant and non-constant versions. +      The constant accessor function returns a constant reference to the +      container and can be used for read-only access. The non-constant +      version returns an unrestricted reference to the container and can +      be used for read-write access. +   </p> + +   <p>The modifier function expects an argument of type reference to +      constant of the container type. The modifier function +      makes a deep copy of its argument. For instance: +   </p> + + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    <element name="member" type="string" minOccurs="unbounded"/> +  </sequence> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef xml_schema::string member_type; +  typedef sequence<member_type> member_sequence; +  typedef member_sequence::iterator member_iterator; +  typedef member_sequence::const_iterator member_const_iterator; + +  // Accessors. +  // +  const member_sequence& +  member () const; + +  member_sequence& +  member (); + +  // Modifier. +  // +  void +  member (const member_sequence&); + +  ... + +}; +  </pre> + +  <p>The <code>sequence</code> class template is defined in an +     implementation-specific namespace. It conforms to the +     sequence interface as defined by the ISO/ANSI Standard for +     C++ (ISO/IEC 14882:1998, Section 23.1.1, "Sequences"). +     Practically, this means that you can treat such a sequence +     as if it was <code>std::vector</code>. Two notable extensions +     to the standard interface that are available only for +     sequences of non-fundamental C++ types are the addition of +     the overloaded <code>push_back</code> and <code>insert</code> +     as well as the <code>detach_back</code> and <code>detach</code> +     member functions. The additional <code>push_back</code> and +     <code>insert</code> functions accept an automatic pointer +     (<code>std::auto_ptr</code> or <code>std::unique_ptr</code>, +     depending on the C++ standard selected) to the +     element type instead of the constant reference. They assume +     ownership of the pointed to object and reset the passed +     automatic pointer. The <code>detach_back</code> and +     <code>detach</code> functions detach the element +     value from the sequence container and, by default, remove +     the element from the sequence. These additional functions +     have the following signatures:</p> + +  <pre class="c++"> +template <typename X> +class sequence +{ +public: +  ... + +  void +  push_back (std::[auto|unique]_ptr<X>) + +  iterator +  insert (iterator position, std::[auto|unique]_ptr<X>) + +  std::[auto|unique]_ptr<X> +  detach_back (bool pop = true); + +  iterator +  detach (iterator position, +          std::[auto|unique]_ptr<X>& result, +          bool erase = true) + +  ... +} +  </pre> + +  <p>The following code shows how one could use this mapping:</p> + +  <pre class="c++"> +void +f (object& o) +{ +  using xml_schema::string; + +  object::member_sequence& s (o.member ()); + +  // Iteration. +  // +  for (object::member_iterator i (s.begin ()); i != s.end (); ++i) +  { +    string& value (*i); +  } + +  // Modification. +  // +  s.push_back ("hello");  // deep copy + +  // C++98 version. +  // +  std::auto_ptr<string> p (new string ("hello")); +  s.push_back (p);        // assumes ownership +  p = s.detach_back ();   // detach and pop +  s.push_back (p);        // re-append + +  // C++11 version. +  // +  std::unique_ptr<string> p (new string ("hello")); +  s.push_back (std::move (p)); // assumes ownership +  p = s.detach_back ();        // detach and pop +  s.push_back (std::move (p)); // re-append + +  // Setting a new container. +  // +  object::member_sequence n; +  n.push_back ("one"); +  n.push_back ("two"); +  o.member (n);           // deep copy +} +  </pre> + +  <h3><a name="2.8.4">2.8.4 Element Order</a></h3> + +  <p>C++/Tree is a "flattening" mapping in a sense that many levels of +     nested compositors (<code>choice</code> and <code>sequence</code>), +     all potentially with their own cardinalities, are in the end mapped +     to a flat set of elements with one of the three cardinality classes +     discussed in the previous sections. While this results in a simple +     and easy to use API for most types, in certain cases, the order of +     elements in the actual XML documents is not preserved once parsed +     into the object model. And sometimes such order has +     application-specific significance. As an example, consider a schema +     that defines a batch of bank transactions:</p> + +  <pre class="xml"> +<complexType name="withdraw"> +  <sequence> +    <element name="account" type="unsignedInt"/> +    <element name="amount" type="unsignedInt"/> +  </sequence> +</complexType> + +<complexType name="deposit"> +  <sequence> +    <element name="account" type="unsignedInt"/> +    <element name="amount" type="unsignedInt"/> +  </sequence> +</complexType> + +<complexType name="batch"> +  <choice minOccurs="0" maxOccurs="unbounded"> +    <element name="withdraw" type="withdraw"/> +    <element name="deposit" type="deposit"/> +  </choice> +</complexType> +  </pre> + +  <p>The batch can contain any number of transactions in any order +     but the order of transactions in each actual batch is significant. +     For instance, consider what could happen if we reorder the +     transactions and apply all the withdrawals before deposits.</p> + +  <p>For the <code>batch</code> schema type defined above the default +     C++/Tree mapping will produce a C++ class that contains a pair of +     sequence containers, one for each of the two elements. While this +     will capture the content (transactions), the order of this content +     as it appears in XML will be lost. Also, if we try to serialize the +     batch we just loaded back to XML, all the withdrawal transactions +     will appear before deposits.</p> + +  <p>To overcome this limitation of a flattening mapping, C++/Tree +     allows us to mark certain XML Schema types, for which content +     order is important, as ordered.</p> + +  <p>There are several command line options that control which +     schema types are treated as ordered. To make an individual +     type ordered, we use the <code>--ordered-type</code> option, +     for example:</p> + +  <pre class="term"> +--ordered-type batch +  </pre> + +  <p>To automatically treat all the types that are derived from an ordered +     type also ordered, we use the <code>--ordered-type-derived</code> +     option. This is primarily useful if you would like to iterate +     over the complete hierarchy's content using the content order +     sequence (discussed below).</p> + +  <p>Ordered types are also useful for handling mixed content. To +     automatically mark all the types with mixed content as ordered +     we use the <code>--ordered-type-mixed</code> option. For more +     information on handling mixed content see <a href="#2.13">Section +     2.13, "Mapping for Mixed Content Models"</a>.</p> + +  <p>Finally, we can mark all the types in the schema we are +     compiling with the <code>--ordered-type-all</code> option. +     You should only resort to this option if all the types in +     your schema truly suffer from the loss of content +     order since, as we will discuss shortly, ordered types +     require extra effort to access and, especially, modify. +     See the +     <a href="http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml">XSD +     Compiler Command Line Manual</a> for more information on +     these options.</p> + +  <p>Once a type is marked ordered, C++/Tree alters its mapping +     in several ways. Firstly, for each local element, element +     wildcard (<a href="#2.12.4">Section 2.12.4, "Element Wildcard +     Order"</a>), and mixed content text (<a href="#2.13">Section +     2.13, "Mapping for Mixed Content Models"</a>) in this type, a +     content id constant is generated. Secondly, an addition sequence +     is added to the class that captures the content order. Here +     is how the mapping of our <code>batch</code> class changes +     once we make it ordered:</p> + +  <pre class="c++"> +class batch: public xml_schema::type +{ +public: +  // withdraw +  // +  typedef withdraw withdraw_type; +  typedef sequence<withdraw_type> withdraw_sequence; +  typedef withdraw_sequence::iterator withdraw_iterator; +  typedef withdraw_sequence::const_iterator withdraw_const_iterator; + +  static const std::size_t withdraw_id = 1; + +  const withdraw_sequence& +  withdraw () const; + +  withdraw_sequence& +  withdraw (); + +  void +  withdraw (const withdraw_sequence&); + +  // deposit +  // +  typedef deposit deposit_type; +  typedef sequence<deposit_type> deposit_sequence; +  typedef deposit_sequence::iterator deposit_iterator; +  typedef deposit_sequence::const_iterator deposit_const_iterator; + +  static const std::size_t deposit_id = 2; + +  const deposit_sequence& +  deposit () const; + +  deposit_sequence& +  deposit (); + +  void +  deposit (const deposit_sequence&); + +  // content_order +  // +  typedef xml_schema::content_order content_order_type; +  typedef std::vector<content_order_type> content_order_sequence; +  typedef content_order_sequence::iterator content_order_iterator; +  typedef content_order_sequence::const_iterator content_order_const_iterator; + +  const content_order_sequence& +  content_order () const; + +  content_order_sequence& +  content_order (); + +  void +  content_order (const content_order_sequence&); + +  ... +}; +  </pre> + +  <p>Notice the <code>withdraw_id</code> and <code>deposit_id</code> +     content ids as well as the extra <code>content_order</code> +     sequence that does not correspond to any element in the +     schema definition. The other changes to the mapping for ordered +     types has to do with XML parsing and serialization code. During +     parsing the content order is captured in the <code>content_order</code> +     sequence while during serialization this sequence is used to +     determine the order in which content is serialized. The +     <code>content_order</code> sequence is also copied during +     copy construction and assigned during copy assignment. It is also +     taken into account during comparison.</p> + +  <p>The entry type of the <code>content_order</code> sequence is the +     <code>xml_schema::content_order</code> type that has the following +     interface:</p> + +  <pre class="c++"> +namespace xml_schema +{ +  struct content_order +  { +    content_order (std::size_t id, std::size_t index = 0); + +    std::size_t id; +    std::size_t index; +  }; + +  bool +  operator== (const content_order&, const content_order&); + +  bool +  operator!= (const content_order&, const content_order&); + +  bool +  operator< (const content_order&, const content_order&); +} +  </pre> + +  <p>The <code>content_order</code> sequence describes the order of +     content (elements, including wildcards, as well as mixed content +     text). Each entry in this sequence consists of the content id +     (for example, <code>withdraw_id</code> or <code>deposit_id</code> +     in our case) as well as, for elements of the sequence cardinality +     class, an index into the corresponding sequence container (the +     index is unused for the one and optional cardinality classes). +     For example, in our case, if the content id is <code>withdraw_id</code>, +     then the index will point into the <code>withdraw</code> element +     sequence.</p> + +  <p>With all this information we can now examine how to iterate over +     transaction in the batch in content order:</p> + +  <pre class="c++"> +batch& b = ... + +for (batch::content_order_const_iterator i (b.content_order ().begin ()); +     i != b.content_order ().end (); +     ++i) +{ +  switch (i->id) +  { +  case batch::withdraw_id: +    { +      const withdraw& t (b.withdraw ()[i->index]); +      cerr << t.account () << " withdraw " << t.amount () << endl; +      break; +    } +  case batch::deposit_id: +    { +      const deposit& t (b.deposit ()[i->index]); +      cerr << t.account () << " deposit " << t.amount () << endl; +      break; +    } +  default: +    { +      assert (false); // Unknown content id. +    } +  } +} +  </pre> + +  <p>If we serialized our batch back to XML, we would also see that the +     order of transactions in the output is exactly the same as in the +     input rather than all the withdrawals first followed by all the +     deposits.</p> + +  <p>The most complex aspect of working with ordered types is +     modifications. Now we not only need to change the content, +     but also remember to update the order information corresponding +     to this change. As a first example, we add a deposit transaction +     to the batch:</p> + +  <pre class="c++"> +using xml_schema::content_order; + +batch::deposit_sequence& d (b.deposit ()); +batch::withdraw_sequence& w (b.withdraw ()); +batch::content_order_sequence& co (b.content_order ()); + +d.push_back (deposit (123456789, 100000)); +co.push_back (content_order (batch::deposit_id, d.size () - 1)); +  </pre> + +  <p>In the above example we first added the content (deposit +     transaction) and then updated the content order information +     by adding an entry with <code>deposit_id</code> content +     id and the index of the just added deposit transaction.</p> + +  <p>Removing the last transaction can be easy if we know which +     transaction (deposit or withdrawal) is last:</p> + +  <pre class="c++"> +d.pop_back (); +co.pop_back (); +  </pre> + +  <p>If, however, we do not know which transaction is last, then +     things get a bit more complicated:</p> + +  <pre class="c++"> +switch (co.back ().id) +{ +case batch::withdraw_id: +  { +    d.pop_back (); +    break; +  } +case batch::deposit_id: +  { +    w.pop_back (); +    break; +  } +} + +co.pop_back (); +  </pre> + +  <p>The following example shows how to add a transaction at the +     beginning of the batch:</p> + +  <pre class="c++"> +w.push_back (withdraw (123456789, 100000)); +co.insert (co.begin (), +           content_order (batch::withdraw_id, w.size () - 1)); +  </pre> + +  <p>Note also that when we merely modify the content of one +     of the elements in place, we do not need to update its +     order since it doesn't change. For example, here is how +     we can change the amount in the first withdrawal:</p> + +  <pre class="c++"> +w[0].amount (10000); +  </pre> + +  <p>For the complete working code shown in this section refer to the +     <code>order/element</code> example in the +     <code>examples/cxx/tree/</code> directory in the XSD distribution.</p> + +  <p>If both the base and derived types are ordered, then the +     content order sequence is only added to the base and the content +     ids are unique within the whole hierarchy. In this case +     the content order sequence for the derived type contains +     ordering information for both base and derived content.</p> + +  <p>In some applications we may need to perform more complex +     content processing. For example, in our case, we may need +     to remove all the withdrawal transactions. The default +     container, <code>std::vector</code>, is not particularly +     suitable for such operations. What may be required by +     some applications is a multi-index container that not +     only allows us to iterate in content order similar to +     <code>std::vector</code> but also search by the content +     id as well as the content id and index pair.</p> + +  <p>While C++/Tree does not provide this functionality by +     default, it allows us to specify a custom container +     type for content order with the <code>--order-container</code> +     command line option. The only requirement from the +     generated code side for such a container is to provide +     the <code>vector</code>-like <code>push_back()</code>, +     <code>size()</code>, and const iteration interfaces.</p> + +  <p>As an example, here is how we can use the Boost Multi-Index +     container for content order. First we create the +     <code>content-order-container.hxx</code> header with the +     following definition (in C++11, use the alias template +     instead):</p> + +  <pre class="c++"> +#ifndef CONTENT_ORDER_CONTAINER +#define CONTENT_ORDER_CONTAINER + +#include <cstddef> // std::size_t + +#include <boost/multi_index_container.hpp> +#include <boost/multi_index/member.hpp> +#include <boost/multi_index/identity.hpp> +#include <boost/multi_index/ordered_index.hpp> +#include <boost/multi_index/random_access_index.hpp> + +struct by_id {}; +struct by_id_index {}; + +template <typename T> +struct content_order_container: +  boost::multi_index::multi_index_container< +    T, +    boost::multi_index::indexed_by< +      boost::multi_index::random_access<>, +      boost::multi_index::ordered_unique< +        boost::multi_index::tag<by_id_index>, +        boost::multi_index::identity<T> +      >, +      boost::multi_index::ordered_non_unique< +        boost::multi_index::tag<by_id>, +        boost::multi_index::member<T, std::size_t, &T::id> +      > +    > +  > +{}; + +#endif +  </pre> + +  <p>Next we add the following two XSD compiler options to include +     this header into every generated header file and to use the +     custom container type (see the XSD compiler command line manual +     for more information on shell quoting for the first option):</p> + +  <pre class="term"> +--hxx-prologue '#include "content-order-container.hxx"' +--order-container content_order_container +  </pre> + +  <p>With these changes we can now use the multi-index functionality, +     for example, to search for a specific content id:</p> + +  <pre class="c++"> +typedef batch::content_order_sequence::index<by_id>::type id_set; +typedef id_set::iterator id_iterator; + +const id_set& ids (b.content_order ().get<by_id> ()); + +std::pair<id_iterator, id_iterator> r ( +  ids.equal_range (std::size_t (batch::deposit_id)); + +for (id_iterator i (r.first); i != r.second; ++i) +{ +  const deposit& t (b.deposit ()[i->index]); +  cerr << t.account () << " deposit " << t.amount () << endl; +} +  </pre> + +  <h2><a name="2.9">2.9 Mapping for Global Elements</a></h2> + +  <p>An XML Schema element definition is called global if it appears +     directly under the <code>schema</code> element. +     A global element is a valid root of an instance document. By +     default, a global element is mapped to a set of overloaded +     parsing and, optionally, serialization functions with the +     same name as the element. It is also possible to generate types +     for root elements instead of parsing and serialization functions. +     This is primarily useful to distinguish object models with the +     same root type but with different root elements. See +     <a href="#2.9.1">Section 2.9.1, "Element Types"</a> for details. +     It is also possible to request the generation of an element map +     which allows uniform parsing and serialization of multiple root +     elements. See <a href="#2.9.2">Section 2.9.2, "Element Map"</a> +     for details. +  </p> + +  <p>The parsing functions read XML instance documents and return +     corresponding object models as an automatic pointer +     (<code>std::auto_ptr</code> or <code>std::unique_ptr</code>, +     depending on the C++ standard selected). Their signatures +     have the following pattern (<code>type</code> denotes +     element's type and <code>name</code> denotes element's +     name): +  </p> + +  <pre class="c++"> +std::[auto|unique]_ptr<type> +name (....); +  </pre> + +  <p>The process of parsing, including the exact signatures of the parsing +     functions, is the subject of <a href="#3">Chapter 3, "Parsing"</a>. +  </p> + +  <p>The serialization functions write object models back to XML instance +     documents. Their signatures have the following pattern: +  </p> + +  <pre class="c++"> +void +name (<stream type>&, const type&, ....); +  </pre> + +  <p>The process of serialization, including the exact signatures of the +     serialization functions, is the subject of <a href="#4">Chapter 4, +     "Serialization"</a>. +  </p> + + +  <h3><a name="2.9.1">2.9.1 Element Types</a></h3> + +  <p>The generation of element types is requested with the +     <code>--generate-element-map</code> option. With this option +     each global element is mapped to a C++ class with the +     same name as the element. Such a class is derived from +     <code>xml_schema::element_type</code> and contains the same set +     of type definitions, constructors, and member function as would a +     type containing a single element with the One cardinality class +     named <code>"value"</code>. In addition, the element type also +     contains a set of member functions for accessing the element +     name and namespace as well as its value in a uniform manner. +     For example:</p> + +  <pre class="xml"> +<complexType name="type"> +  <sequence> +    ... +  </sequence> +</complexType> + +<element name="root" type="type"/> +  </pre> + +<p>is mapped to:</p> + +  <pre class="c++"> +class type +{ +  ... +}; + +class root: public xml_schema::element_type +{ +public: +  // Element value. +  // +  typedef type value_type; + +  const value_type& +  value () const; + +  value_type& +  value (); + +  void +  value (const value_type&); + +  void +  value (std::[auto|unique]_ptr<value_type>); + +  // Constructors. +  // +  root (const value_type&); + +  root (std::[auto|unique]_ptr<value_type>); + +  root (const xercesc::DOMElement&, xml_schema::flags = 0); + +  root (const root&, xml_schema::flags = 0); + +  virtual root* +  _clone (xml_schema::flags = 0) const; + +  // Element name and namespace. +  // +  static const std::string& +  name (); + +  static const std::string& +  namespace_ (); + +  virtual const std::string& +  _name () const; + +  virtual const std::string& +  _namespace () const; + +  // Element value as xml_schema::type. +  // +  virtual const xml_schema::type* +  _value () const; + +  virtual xml_schema::type* +  _value (); +}; + +void +operator<< (xercesc::DOMElement&, const root&); +  </pre> + +  <p>The <code>xml_schema::element_type</code> class is a common +     base type for all element types and is defined as follows:</p> + +  <pre class="c++"> +namespace xml_schema +{ +  class element_type +  { +  public: +    virtual +    ~element_type (); + +    virtual element_type* +    _clone (flags f = 0) const = 0; + +    virtual const std::basic_string<C>& +    _name () const = 0; + +    virtual const std::basic_string<C>& +    _namespace () const = 0; + +    virtual xml_schema::type* +    _value () = 0; + +    virtual const xml_schema::type* +    _value () const = 0; +  }; +} +  </pre> + +  <p>The <code>_value()</code> member function returns a pointer to +     the element value or 0 if the element is of a fundamental C++ +     type and therefore is not derived from <code>xml_schema::type</code>. +  </p> + +  <p>Unlike parsing and serialization functions, element types +     are only capable of parsing and serializing from/to a +     <code>DOMElement</code> object. This means that the application +     will need to perform its own XML-to-DOM parsing and DOM-to-XML +     serialization. The following section describes a mechanism +     provided by the mapping to uniformly parse and serialize +     multiple root elements.</p> + + +  <h3><a name="2.9.2">2.9.2 Element Map</a></h3> + +  <p>When element types are generated for root elements it is also +     possible to request the generation of an element map with the +     <code>--generate-element-map</code> option. The element map +     allows uniform parsing and serialization of multiple root +     elements via the common <code>xml_schema::element_type</code> +     base type. The <code>xml_schema::element_map</code> class is +     defined as follows:</p> + +  <pre class="c++"> +namespace xml_schema +{ +  class element_map +  { +  public: +    static std::[auto|unique]_ptr<xml_schema::element_type> +    parse (const xercesc::DOMElement&, flags = 0); + +    static void +    serialize (xercesc::DOMElement&, const element_type&); +  }; +} +  </pre> + +  <p>The <code>parse()</code> function creates the corresponding +     element type object based on the element name and namespace +     and returns it as an automatic pointer (<code>std::auto_ptr</code> +     or <code>std::unique_ptr</code>, depending on the C++ standard +     selected) to <code>xml_schema::element_type</code>. +     The <code>serialize()</code> function serializes the passed element +     object to <code>DOMElement</code>. Note that in case of +     <code>serialize()</code>, the <code>DOMElement</code> object +     should have the correct name and namespace. If no element type is +     available for an element, both functions throw the +     <code>xml_schema::no_element_info</code> exception:</p> + +  <pre class="c++"> +struct no_element_info: virtual exception +{ +  no_element_info (const std::basic_string<C>& element_name, +                   const std::basic_string<C>& element_namespace); + +  const std::basic_string<C>& +  element_name () const; + +  const std::basic_string<C>& +  element_namespace () const; + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The application can discover the actual type of the element +     object returned by <code>parse()</code> either using +     <code>dynamic_cast</code> or by comparing element names and +     namespaces. The following code fragments illustrate how the +     element map can be used:</p> + +  <pre class="c++"> +// Parsing. +// +DOMElement& e = ... // Parse XML to DOM. + +auto_ptr<xml_schema::element_type> r ( +  xml_schema::element_map::parse (e)); + +if (root1 r1 = dynamic_cast<root1*> (r.get ())) +{ +  ... +} +else if (r->_name == root2::name () && +         r->_namespace () == root2::namespace_ ()) +{ +  root2& r2 (static_cast<root2&> (*r)); + +  ... +} +  </pre> + +  <pre class="c++"> +// Serialization. +// +xml_schema::element_type& r = ... + +string name (r._name ()); +string ns (r._namespace ()); + +DOMDocument& doc = ... // Create a new DOMDocument with name and ns. +DOMElement& e (*doc->getDocumentElement ()); + +xml_schema::element_map::serialize (e, r); + +// Serialize DOMDocument to XML. +  </pre> + +  <!-- --> + +  <h2><a name="2.10">2.10 Mapping for Global Attributes</a></h2> + +  <p>An XML Schema attribute definition is called global if it appears +     directly under the <code>schema</code> element. A global +     attribute does not have any mapping. +  </p> + +  <!-- +     When it is referenced from +     a local attribute definition (using the <code>ref</code> attribute) +     it is treated as a local attribute (see Section 2.8, "Mapping for +     Local Elements and Attributes"). +  --> + +  <h2><a name="2.11">2.11 Mapping for <code>xsi:type</code> and Substitution +      Groups</a></h2> + +  <p>The mapping provides optional support for the XML Schema polymorphism +     features (<code>xsi:type</code> and substitution groups) which can +     be requested with the <code>--generate-polymorphic</code> option. +     When used, the dynamic type of a member may be different from +     its static type. Consider the following schema definition and +     instance document: +  </p> + +  <pre class="xml"> +<!-- test.xsd --> +<schema> +  <complexType name="base"> +    <attribute name="text" type="string"/> +  </complexType> + +  <complexType name="derived"> +    <complexContent> +      <extension base="base"> +        <attribute name="extra-text" type="string"/> +      </extension> +    </complexContent> +  </complexType> + +  <complexType name="root_type"> +    <sequence> +      <element name="item" type="base" maxOccurs="unbounded"/> +    </sequence> +  </complexType> + +  <element name="root" type="root_type"/> +</schema> + +<!-- test.xml --> +<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> +  <item text="hello"/> +  <item text="hello" extra-text="world" xsi:type="derived"/> +</root> +  </pre> + +  <p>In the resulting object model, the container for +     the <code>root::item</code> member will have two elements: +     the first element's type will be <code>base</code> while +     the second element's (dynamic) type will be +     <code>derived</code>. This can be discovered using the +     <code>dynamic_cast</code> operator as shown in the following +     example: +  </p> + +  <pre class="c++"> +void +f (root& r) +{ +  for (root::item_const_iterator i (r.item ().begin ()); +       i != r.item ().end () +       ++i) +  { +    if (derived* d = dynamic_cast<derived*> (&(*i))) +    { +      // derived +    } +    else +    { +      // base +    } +  } +} +  </pre> + +  <p>The <code>_clone</code> virtual function should be used instead of +     copy constructors to make copies of members that might use +     polymorphism: +  </p> + +  <pre class="c++"> +void +f (root& r) +{ +  for (root::item_const_iterator i (r.item ().begin ()); +       i != r.item ().end () +       ++i) +  { +    std::auto_ptr<base> c (i->_clone ()); +  } +} +  </pre> + +  <p>The mapping can often automatically determine which types are +     polymorphic based on the substitution group declarations. However, +     if your XML vocabulary is not using substitution groups or if +     substitution groups are defined in a separate schema, then you will +     need to use the <code>--polymorphic-type</code> option to specify +     which types are polymorphic. When using this option you only need +     to specify the root of a polymorphic type hierarchy and the mapping +     will assume that all the derived types are also polymorphic. +     Also note that you need to specify this option when compiling every +     schema file that references the polymorphic type. Consider the following +     two schemas as an example:</p> + +  <pre class="xml"> +<!-- base.xsd --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + +  <xs:complexType name="base"> +    <xs:sequence> +      <xs:element name="b" type="xs:int"/> +    </xs:sequence> +  </xs:complexType> + +  <!-- substitution group root --> +  <xs:element name="base" type="base"/> + +</xs:schema> +  </pre> + +  <pre class="xml"> +<!-- derived.xsd --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> + +  <include schemaLocation="base.xsd"/> + +  <xs:complexType name="derived"> +    <xs:complexContent> +      <xs:extension base="base"> +        <xs:sequence> +          <xs:element name="d" type="xs:string"/> +        </xs:sequence> +      </xs:extension> +    </xs:complexContent> +  </xs:complexType> + +  <xs:element name="derived" type="derived" substitutionGroup="base"/> + +</xs:schema> +  </pre> + +  <p>In this example we need to specify "<code>--polymorphic-type base</code>" +     when compiling both schemas because the substitution group is declared +     in a schema other than the one defining type <code>base</code>.</p> + +  <p>You can also indicate that all types should be treated as polymorphic +     with the <code>--polymorphic-type-all</code>. However, this may result +     in slower generated code with a greater footprint.</p> + + +  <!-- Mapping for any and anyAttribute --> + + +  <h2><a name="2.12">2.12 Mapping for <code>any</code> and <code>anyAttribute</code></a></h2> + +  <p>For the XML Schema <code>any</code> and <code>anyAttribute</code> +     wildcards an optional mapping can be requested with the +     <code>--generate-wildcard</code> option. The mapping represents +     the content matched by wildcards as DOM fragments. Because the +     DOM API is used to access such content, the Xerces-C++ runtime +     should be initialized by the application prior to parsing and +     should remain initialized for the lifetime of objects with +     the wildcard content. For more information on the Xerces-C++ +     runtime initialization see <a href="#3.1">Section 3.1, +     "Initializing the Xerces-C++ Runtime"</a>. +  </p> + +  <p>The mapping for <code>any</code> is similar to the mapping for +     local elements (see <a href="#2.8">Section 2.8, "Mapping for Local +     Elements and Attributes"</a>) except that the type used in the +     wildcard mapping is <code>xercesc::DOMElement</code>. As with local +     elements, the mapping divides all possible cardinality combinations +     into three cardinality classes: <i>one</i>, <i>optional</i>, and +     <i>sequence</i>. +  </p> + +  <p>The mapping for <code>anyAttribute</code> represents the attributes +     matched by this wildcard as a set of <code>xercesc::DOMAttr</code> +     objects with a key being the attribute's name and namespace.</p> + +  <p>Similar to local elements and attributes, the <code>any</code> and +     <code>anyAttribute</code> wildcards are mapped to a set of public type +     definitions (typedefs) and a set of public accessor and modifier +     functions. Type definitions have names derived from <code>"any"</code> +     for the <code>any</code> wildcard and <code>"any_attribute"</code> +     for the <code>anyAttribute</code> wildcard. The accessor and modifier +     functions are named <code>"any"</code> for the <code>any</code> wildcard +     and <code>"any_attribute"</code> for the <code>anyAttribute</code> +     wildcard. Subsequent wildcards in the same type have escaped names +     such as <code>"any1"</code> or <code>"any_attribute1"</code>. +  </p> + +  <p>Because Xerces-C++ DOM nodes always belong to a <code>DOMDocument</code>, +     each type with a wildcard has an associated <code>DOMDocument</code> +     object. The reference to this object can be obtained using the accessor +     function called <code>dom_document</code>. The access to the document +     object from the application code may be necessary to create or modify +     the wildcard content. For example: +  </p> + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    <any namespace="##other"/> +  </sequence> +  <anyAttribute namespace="##other"/> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  // any +  // +  const xercesc::DOMElement& +  any () const; + +  void +  any (const xercesc::DOMElement&); + +  ... + +  // any_attribute +  // +  typedef attribute_set any_attribute_set; +  typedef any_attribute_set::iterator any_attribute_iterator; +  typedef any_attribute_set::const_iterator any_attribute_const_iterator; + +  const any_attribute_set& +  any_attribute () const; + +  any_attribute_set& +  any_attribute (); + +  ... + +  // DOMDocument object for wildcard content. +  // +  const xercesc::DOMDocument& +  dom_document () const; + +  xercesc::DOMDocument& +  dom_document (); + +  ... +}; +  </pre> + + +  <p>Names and semantics of type definitions for the wildcards as well +     as signatures of the accessor and modifier functions depend on the +     wildcard type as well as the cardinality class for the <code>any</code> +     wildcard. They are described in the following sub-sections. +  </p> + + +  <h3><a name="2.12.1">2.12.1 Mapping for <code>any</code> with the One Cardinality Class</a></h3> + +  <p>For <code>any</code> with the One cardinality class, +     there are no type definitions. The accessor functions come in +     constant and non-constant versions. The constant accessor function +     returns a constant reference to <code>xercesc::DOMElement</code> and +     can be used for read-only access. The non-constant version returns +     an unrestricted reference to <code>xercesc::DOMElement</code> and can +     be used for read-write access. +  </p> + +  <p>The first modifier function expects an argument of type reference +     to constant <code>xercesc::DOMElement</code> and makes a deep copy +     of its argument. The second modifier function expects an argument of +     type pointer to <code>xercesc::DOMElement</code>. This modifier +     function assumes ownership of its argument and expects the element +     object to be created using the DOM document associated with this +     instance. For example: +  </p> + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    <any namespace="##other"/> +  </sequence> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  // Accessors. +  // +  const xercesc::DOMElement& +  any () const; + +  xercesc::DOMElement& +  any (); + +  // Modifiers. +  // +  void +  any (const xercesc::DOMElement&); + +  void +  any (xercesc::DOMElement*); + +  ... + +}; +  </pre> + + +  <p>The following code shows how one could use this mapping:</p> + +  <pre class="c++"> +void +f (object& o, const xercesc::DOMElement& e) +{ +  using namespace xercesc; + +  DOMElement& e1 (o.any ());             // get +  o.any (e)                              // set, deep copy +  DOMDocument& doc (o.dom_document ()); +  o.any (doc.createElement (...));       // set, assumes ownership +} +  </pre> + +  <h3><a name="2.12.2">2.12.2 Mapping for <code>any</code> with the Optional Cardinality Class</a></h3> + +  <p>For <code>any</code> with the Optional cardinality class, the type +     definitions consist of an alias for the container type with name +     <code>any_optional</code> (or <code>any1_optional</code>, etc., for +     subsequent wildcards in the type definition). +  </p> + +  <p>Unlike accessor functions for the One cardinality class, accessor +     functions for the Optional cardinality class return references to +     corresponding containers rather than directly to <code>DOMElement</code>. +     The accessor functions come in constant and non-constant versions. +     The constant accessor function returns a constant reference to +     the container and can be used for read-only access. The non-constant +     version returns an unrestricted reference to the container +     and can be used for read-write access. +  </p> + +  <p>The modifier functions are overloaded for <code>xercesc::DOMElement</code> +     and the container type. The first modifier function expects an argument of +     type reference to constant <code>xercesc::DOMElement</code> and +     makes a deep copy of its argument. The second modifier function +     expects an argument of type pointer to <code>xercesc::DOMElement</code>. +     This modifier function assumes ownership of its argument and expects +     the element object to be created using the DOM document associated +     with this instance. The third modifier function expects an argument +     of type reference to constant of the container type and makes a +     deep copy of its argument. For instance: +  </p> + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    <any namespace="##other" minOccurs="0"/> +  </sequence> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef element_optional any_optional; + +  // Accessors. +  // +  const any_optional& +  any () const; + +  any_optional& +  any (); + +  // Modifiers. +  // +  void +  any (const xercesc::DOMElement&); + +  void +  any (xercesc::DOMElement*); + +  void +  any (const any_optional&); + +  ... + +}; +  </pre> + + +  <p>The <code>element_optional</code> container is a +     specialization of the <code>optional</code> class template described +     in <a href="#2.8.2">Section 2.8.2, "Mapping for Members with the Optional +     Cardinality Class"</a>. Its interface is presented below: +  </p> + +  <pre class="c++"> +class element_optional +{ +public: +  explicit +  element_optional (xercesc::DOMDocument&); + +  // Makes a deep copy. +  // +  element_optional (const xercesc::DOMElement&, xercesc::DOMDocument&); + +  // Assumes ownership. +  // +  element_optional (xercesc::DOMElement*, xercesc::DOMDocument&); + +  element_optional (const element_optional&, xercesc::DOMDocument&); + +public: +  element_optional& +  operator= (const xercesc::DOMElement&); + +  element_optional& +  operator= (const element_optional&); + +  // Pointer-like interface. +  // +public: +  const xercesc::DOMElement* +  operator-> () const; + +  xercesc::DOMElement* +  operator-> (); + +  const xercesc::DOMElement& +  operator* () const; + +  xercesc::DOMElement& +  operator* (); + +  typedef void (element_optional::*bool_convertible) (); +  operator bool_convertible () const; + +  // Get/set interface. +  // +public: +  bool +  present () const; + +  const xercesc::DOMElement& +  get () const; + +  xercesc::DOMElement& +  get (); + +  // Makes a deep copy. +  // +  void +  set (const xercesc::DOMElement&); + +  // Assumes ownership. +  // +  void +  set (xercesc::DOMElement*); + +  void +  reset (); +}; + +bool +operator== (const element_optional&, const element_optional&); + +bool +operator!= (const element_optional&, const element_optional&); +  </pre> + + +  <p>The following code shows how one could use this mapping:</p> + +  <pre class="c++"> +void +f (object& o, const xercesc::DOMElement& e) +{ +  using namespace xercesc; + +  DOMDocument& doc (o.dom_document ()); + +  if (o.any ().present ())                  // test +  { +    DOMElement& e1 (o.any ().get ());       // get +    o.any ().set (e);                       // set, deep copy +    o.any ().set (doc.createElement (...)); // set, assumes ownership +    o.any ().reset ();                      // reset +  } + +  // Same as above but using pointer notation: +  // +  if (o.member ())                          // test +  { +    DOMElement& e1 (*o.any ());             // get +    o.any (e);                              // set, deep copy +    o.any (doc.createElement (...));        // set, assumes ownership +    o.any ().reset ();                      // reset +  } +} +  </pre> + + + +  <h3><a name="2.12.3">2.12.3 Mapping for <code>any</code> with the Sequence Cardinality Class</a></h3> + +  <p>For <code>any</code> with the Sequence cardinality class, the type +     definitions consist of an alias of the container type with name +     <code>any_sequence</code> (or <code>any1_sequence</code>, etc., for +     subsequent wildcards in the type definition), an alias of the iterator +     type with name <code>any_iterator</code> (or <code>any1_iterator</code>, +     etc., for subsequent wildcards in the type definition), and an alias +     of the constant iterator type with name <code>any_const_iterator</code> +     (or <code>any1_const_iterator</code>, etc., for subsequent wildcards +     in the type definition). +  </p> + +  <p>The accessor functions come in constant and non-constant versions. +     The constant accessor function returns a constant reference to the +     container and can be used for read-only access. The non-constant +     version returns an unrestricted reference to the container and can +     be used for read-write access. +  </p> + +  <p>The modifier function expects an argument of type reference to +     constant of the container type. The modifier function makes +     a deep copy of its argument. For instance: +  </p> + + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    <any namespace="##other" minOccurs="unbounded"/> +  </sequence> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef element_sequence any_sequence; +  typedef any_sequence::iterator any_iterator; +  typedef any_sequence::const_iterator any_const_iterator; + +  // Accessors. +  // +  const any_sequence& +  any () const; + +  any_sequence& +  any (); + +  // Modifier. +  // +  void +  any (const any_sequence&); + +  ... + +}; +  </pre> + +  <p>The <code>element_sequence</code> container is a +     specialization of the <code>sequence</code> class template described +     in <a href="#2.8.3">Section 2.8.3, "Mapping for Members with the +     Sequence Cardinality Class"</a>. Its interface is similar to +     the sequence interface as defined by the ISO/ANSI Standard for +     C++ (ISO/IEC 14882:1998, Section 23.1.1, "Sequences") and is +     presented below: +  </p> + +  <pre class="c++"> +class element_sequence +{ +public: +  typedef xercesc::DOMElement        value_type; +  typedef xercesc::DOMElement*       pointer; +  typedef const xercesc::DOMElement* const_pointer; +  typedef xercesc::DOMElement&       reference; +  typedef const xercesc::DOMElement& const_reference; + +  typedef <implementation-defined>   iterator; +  typedef <implementation-defined>   const_iterator; +  typedef <implementation-defined>   reverse_iterator; +  typedef <implementation-defined>   const_reverse_iterator; + +  typedef <implementation-defined>   size_type; +  typedef <implementation-defined>   difference_type; +  typedef <implementation-defined>   allocator_type; + +public: +  explicit +  element_sequence (xercesc::DOMDocument&); + +  // DOMElement cannot be default-constructed. +  // +  // explicit +  // element_sequence (size_type n); + +  element_sequence (size_type n, +                    const xercesc::DOMElement&, +                    xercesc::DOMDocument&); + +  template <typename I> +  element_sequence (const I& begin, +                    const I& end, +                    xercesc::DOMDocument&); + +  element_sequence (const element_sequence&, xercesc::DOMDocument&); + +  element_sequence& +  operator= (const element_sequence&); + +public: +  void +  assign (size_type n, const xercesc::DOMElement&); + +  template <typename I> +  void +  assign (const I& begin, const I& end); + +public: +  // This version of resize can only be used to shrink the +  // sequence because DOMElement cannot be default-constructed. +  // +  void +  resize (size_type); + +  void +  resize (size_type, const xercesc::DOMElement&); + +public: +  size_type +  size () const; + +  size_type +  max_size () const; + +  size_type +  capacity () const; + +  bool +  empty () const; + +  void +  reserve (size_type); + +  void +  clear (); + +public: +  const_iterator +  begin () const; + +  const_iterator +  end () const; + +  iterator +  begin (); + +  iterator +  end (); + +  const_reverse_iterator +  rbegin () const; + +  const_reverse_iterator +  rend () const + +    reverse_iterator +  rbegin (); + +  reverse_iterator +  rend (); + +public: +  xercesc::DOMElement& +  operator[] (size_type); + +  const xercesc::DOMElement& +  operator[] (size_type) const; + +  xercesc::DOMElement& +  at (size_type); + +  const xercesc::DOMElement& +  at (size_type) const; + +  xercesc::DOMElement& +  front (); + +  const xercesc::DOMElement& +  front () const; + +  xercesc::DOMElement& +  back (); + +  const xercesc::DOMElement& +  back () const; + +public: +  // Makes a deep copy. +  // +  void +  push_back (const xercesc::DOMElement&); + +  // Assumes ownership. +  // +  void +  push_back (xercesc::DOMElement*); + +  void +  pop_back (); + +  // Makes a deep copy. +  // +  iterator +  insert (iterator position, const xercesc::DOMElement&); + +  // Assumes ownership. +  // +  iterator +  insert (iterator position, xercesc::DOMElement*); + +  void +  insert (iterator position, size_type n, const xercesc::DOMElement&); + +  template <typename I> +  void +  insert (iterator position, const I& begin, const I& end); + +  iterator +  erase (iterator position); + +  iterator +  erase (iterator begin, iterator end); + +public: +  // Note that the DOMDocument object of the two sequences being +  // swapped should be the same. +  // +  void +  swap (sequence& x); +}; + +inline bool +operator== (const element_sequence&, const element_sequence&); + +inline bool +operator!= (const element_sequence&, const element_sequence&); +  </pre> + + +  <p>The following code shows how one could use this mapping:</p> + +  <pre class="c++"> +void +f (object& o, const xercesc::DOMElement& e) +{ +  using namespace xercesc; + +  object::any_sequence& s (o.any ()); + +  // Iteration. +  // +  for (object::any_iterator i (s.begin ()); i != s.end (); ++i) +  { +    DOMElement& e (*i); +  } + +  // Modification. +  // +  s.push_back (e);                       // deep copy +  DOMDocument& doc (o.dom_document ()); +  s.push_back (doc.createElement (...)); // assumes ownership +} +  </pre> + +  <h3><a name="2.12.4">2.12.4 Element Wildcard Order</a></h3> + +  <p>Similar to elements, element wildcards in ordered types +     (<a href="#2.8.4">Section 2.8.4, "Element Order"</a>) are assigned +     content ids and are included in the content order sequence. +     Continuing with the bank transactions example started in Section +     2.8.4, we can extend the batch by allowing custom transactions:</p> + +  <pre class="xml"> +<complexType name="batch"> +  <choice minOccurs="0" maxOccurs="unbounded"> +    <element name="withdraw" type="withdraw"/> +    <element name="deposit" type="deposit"/> +    <any namespace="##other" processContents="lax"/> +  </choice> +</complexType> +  </pre> + +  <p>This will lead to the following changes in the generated +     <code>batch</code> C++ class:</p> + +  <pre class="c++"> +class batch: public xml_schema::type +{ +public: +  ... + +  // any +  // +  typedef element_sequence any_sequence; +  typedef any_sequence::iterator any_iterator; +  typedef any_sequence::const_iterator any_const_iterator; + +  static const std::size_t any_id = 3UL; + +  const any_sequence& +  any () const; + +  any_sequence& +  any (); + +  void +  any (const any_sequence&); + +  ... +}; +  </pre> + +  <p>With this change we also need to update the iteration code to handle +     the new content id:</p> + +  <pre class="c++"> +for (batch::content_order_const_iterator i (b.content_order ().begin ()); +     i != b.content_order ().end (); +     ++i) +{ +  switch (i->id) +  { +    ... + +  case batch::any_id: +    { +      const DOMElement& e (b.any ()[i->index]); +      ... +      break; +    } + +    ... +  } +} +  </pre> + +  <p>For the complete working code that shows the use of wildcards in +     ordered types refer to the <code>order/element</code> example in +     the <code>examples/cxx/tree/</code> directory in the XSD +     distribution.</p> + +  <h3><a name="2.12.5">2.12.5 Mapping for <code>anyAttribute</code></a></h3> + +  <p>For <code>anyAttribute</code> the type definitions consist of an alias +     of the container type with name <code>any_attribute_set</code> +     (or <code>any1_attribute_set</code>, etc., for subsequent wildcards +     in the type definition), an alias of the iterator type with name +     <code>any_attribute_iterator</code> (or <code>any1_attribute_iterator</code>, +     etc., for subsequent wildcards in the type definition), and an alias +     of the constant iterator type with name <code>any_attribute_const_iterator</code> +     (or <code>any1_attribute_const_iterator</code>, etc., for subsequent +     wildcards in the type definition). +  </p> + +  <p>The accessor functions come in constant and non-constant versions. +     The constant accessor function returns a constant reference to the +     container and can be used for read-only access. The non-constant +     version returns an unrestricted reference to the container and can +     be used for read-write access. +  </p> + +  <p>The modifier function expects an argument of type reference to +     constant of the container type. The modifier function makes +     a deep copy of its argument. For instance: +  </p> + + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    ... +  </sequence> +  <anyAttribute namespace="##other"/> +</complexType> +  </pre> + +  <p>is mapped to:</p> + +  <pre class="c++"> +class object: public xml_schema::type +{ +public: +  // Type definitions. +  // +  typedef attribute_set any_attribute_set; +  typedef any_attribute_set::iterator any_attribute_iterator; +  typedef any_attribute_set::const_iterator any_attribute_const_iterator; + +  // Accessors. +  // +  const any_attribute_set& +  any_attribute () const; + +  any_attribute_set& +  any_attribute (); + +  // Modifier. +  // +  void +  any_attribute (const any_attribute_set&); + +  ... + +}; +  </pre> + +  <p>The <code>attribute_set</code> class is an associative container +     similar to the <code>std::set</code> class template as defined by +     the ISO/ANSI Standard for C++ (ISO/IEC 14882:1998, Section 23.3.3, +     "Class template set") with the key being the attribute's name +     and namespace. Unlike <code>std::set</code>, <code>attribute_set</code> +     allows searching using names and namespaces instead of +     <code>xercesc::DOMAttr</code> objects. It is defined in an +     implementation-specific namespace and its interface is presented +     below: +  </p> + +  <pre class="c++"> +class attribute_set +{ +public: +  typedef xercesc::DOMAttr         key_type; +  typedef xercesc::DOMAttr         value_type; +  typedef xercesc::DOMAttr*        pointer; +  typedef const xercesc::DOMAttr*  const_pointer; +  typedef xercesc::DOMAttr&        reference; +  typedef const xercesc::DOMAttr&  const_reference; + +  typedef <implementation-defined> iterator; +  typedef <implementation-defined> const_iterator; +  typedef <implementation-defined> reverse_iterator; +  typedef <implementation-defined> const_reverse_iterator; + +  typedef <implementation-defined> size_type; +  typedef <implementation-defined> difference_type; +  typedef <implementation-defined> allocator_type; + +public: +  attribute_set (xercesc::DOMDocument&); + +  template <typename I> +  attribute_set (const I& begin, const I& end, xercesc::DOMDocument&); + +  attribute_set (const attribute_set&, xercesc::DOMDocument&); + +  attribute_set& +  operator= (const attribute_set&); + +public: +  const_iterator +  begin () const; + +  const_iterator +  end () const; + +  iterator +  begin (); + +  iterator +  end (); + +  const_reverse_iterator +  rbegin () const; + +  const_reverse_iterator +  rend () const; + +  reverse_iterator +  rbegin (); + +  reverse_iterator +  rend (); + +public: +  size_type +  size () const; + +  size_type +  max_size () const; + +  bool +  empty () const; + +  void +  clear (); + +public: +  // Makes a deep copy. +  // +  std::pair<iterator, bool> +  insert (const xercesc::DOMAttr&); + +  // Assumes ownership. +  // +  std::pair<iterator, bool> +  insert (xercesc::DOMAttr*); + +  // Makes a deep copy. +  // +  iterator +  insert (iterator position, const xercesc::DOMAttr&); + +  // Assumes ownership. +  // +  iterator +  insert (iterator position, xercesc::DOMAttr*); + +  template <typename I> +  void +  insert (const I& begin, const I& end); + +public: +  void +  erase (iterator position); + +  size_type +  erase (const std::basic_string<C>& name); + +  size_type +  erase (const std::basic_string<C>& namespace_, +         const std::basic_string<C>& name); + +  size_type +  erase (const XMLCh* name); + +  size_type +  erase (const XMLCh* namespace_, const XMLCh* name); + +  void +  erase (iterator begin, iterator end); + +public: +  size_type +  count (const std::basic_string<C>& name) const; + +  size_type +  count (const std::basic_string<C>& namespace_, +         const std::basic_string<C>& name) const; + +  size_type +  count (const XMLCh* name) const; + +  size_type +  count (const XMLCh* namespace_, const XMLCh* name) const; + +  iterator +  find (const std::basic_string<C>& name); + +  iterator +  find (const std::basic_string<C>& namespace_, +        const std::basic_string<C>& name); + +  iterator +  find (const XMLCh* name); + +  iterator +  find (const XMLCh* namespace_, const XMLCh* name); + +  const_iterator +  find (const std::basic_string<C>& name) const; + +  const_iterator +  find (const std::basic_string<C>& namespace_, +        const std::basic_string<C>& name) const; + +  const_iterator +  find (const XMLCh* name) const; + +  const_iterator +  find (const XMLCh* namespace_, const XMLCh* name) const; + +public: +  // Note that the DOMDocument object of the two sets being +  // swapped should be the same. +  // +  void +  swap (attribute_set&); +}; + +bool +operator== (const attribute_set&, const attribute_set&); + +bool +operator!= (const attribute_set&, const attribute_set&); +  </pre> + +  <p>The following code shows how one could use this mapping:</p> + +  <pre class="c++"> +void +f (object& o, const xercesc::DOMAttr& a) +{ +  using namespace xercesc; + +  object::any_attribute_set& s (o.any_attribute ()); + +  // Iteration. +  // +  for (object::any_attribute_iterator i (s.begin ()); i != s.end (); ++i) +  { +    DOMAttr& a (*i); +  } + +  // Modification. +  // +  s.insert (a);                         // deep copy +  DOMDocument& doc (o.dom_document ()); +  s.insert (doc.createAttribute (...)); // assumes ownership + +  // Searching. +  // +  object::any_attribute_iterator i (s.find ("name")); +  i = s.find ("http://www.w3.org/XML/1998/namespace", "lang"); +} +  </pre> + +  <!-- Mapping for Mixed Content Models --> + +  <h2><a name="2.13">2.13 Mapping for Mixed Content Models</a></h2> + +  <p>For XML Schema types with mixed content models C++/Tree provides +     mapping support only if the type is marked as ordered +     (<a href="#2.8.4">Section 2.8.4, "Element Order"</a>). Use the +     <code>--ordered-type-mixed</code> XSD compiler option to +     automatically mark all types with mixed content as ordered.</p> + +  <p>For an ordered type with mixed content, C++/Tree adds an extra +     text content sequence that is used to store the text fragments. +     This text content sequence is also assigned the content id and +     its entries are included in the content order sequence, just +     like elements. As a result, it is possible to capture the order +     between elements and text fragments.</p> + +  <p>As an example, consider the following schema that describes text +     with embedded links:</p> + +  <pre class="xml"> +<complexType name="anchor"> +  <simpleContent> +    <extension base="string"> +      <attribute name="href" type="anyURI" use="required"/> +    </extension> +  </simpleContent> +</complexType> + +<complexType name="text" mixed="true"> +  <sequence> +    <element name="a" type="anchor" minOccurs="0" maxOccurs="unbounded"/> +  </sequence> +</complexType> +  </pre> + +  <p>The generated <code>text</code> C++ class will provide the following +     API (assuming it is marked as ordered):</p> + +  <pre class="c++"> +class text: public xml_schema::type +{ +public: +  // a +  // +  typedef anchor a_type; +  typedef sequence<a_type> a_sequence; +  typedef a_sequence::iterator a_iterator; +  typedef a_sequence::const_iterator a_const_iterator; + +  static const std::size_t a_id = 1UL; + +  const a_sequence& +  a () const; + +  a_sequence& +  a (); + +  void +  a (const a_sequence&); + +  // text_content +  // +  typedef xml_schema::string text_content_type; +  typedef sequence<text_content_type> text_content_sequence; +  typedef text_content_sequence::iterator text_content_iterator; +  typedef text_content_sequence::const_iterator text_content_const_iterator; + +  static const std::size_t text_content_id = 2UL; + +  const text_content_sequence& +  text_content () const; + +  text_content_sequence& +  text_content (); + +  void +  text_content (const text_content_sequence&); + +  // content_order +  // +  typedef xml_schema::content_order content_order_type; +  typedef std::vector<content_order_type> content_order_sequence; +  typedef content_order_sequence::iterator content_order_iterator; +  typedef content_order_sequence::const_iterator content_order_const_iterator; + +  const content_order_sequence& +  content_order () const; + +  content_order_sequence& +  content_order (); + +  void +  content_order (const content_order_sequence&); + +  ... +}; +  </pre> + +  <p>Given this interface we can iterate over both link elements +     and text in content order. The following code fragment converts +     our format to plain text with references.</p> + +  <pre class="c++"> +const text& t = ... + +for (text::content_order_const_iterator i (t.content_order ().begin ()); +     i != t.content_order ().end (); +     ++i) +{ +  switch (i->id) +  { +  case text::a_id: +    { +      const anchor& a (t.a ()[i->index]); +      cerr << a << "[" << a.href () << "]"; +      break; +    } +  case text::text_content_id: +    { +      const xml_schema::string& s (t.text_content ()[i->index]); +      cerr << s; +      break; +    } +  default: +    { +      assert (false); // Unknown content id. +    } +  } +} +  </pre> + +  <p>For the complete working code that shows the use of mixed content +     in ordered types refer to the <code>order/mixed</code> example in +     the <code>examples/cxx/tree/</code> directory in the XSD +     distribution.</p> + +  <!-- Parsing --> + + +  <h1><a name="3">3 Parsing</a></h1> + +  <p>This chapter covers various aspects of parsing XML instance +     documents in order to obtain corresponding tree-like object +     model. +  </p> + +  <p>Each global XML Schema element in the form:</p> + +  <pre class="xml"> +<element name="name" type="type"/> +  </pre> + +  <p>is mapped to 14 overloaded C++ functions in the form:</p> + +  <pre class="c++"> +// Read from a URI or a local file. +// + +std::[auto|unique]_ptr<type> +name (const std::basic_string<C>& uri, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + +std::[auto|unique]_ptr<type> +name (const std::basic_string<C>& uri, +      xml_schema::error_handler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + +std::[auto|unique]_ptr<type> +name (const std::basic_string<C>& uri, +      xercesc::DOMErrorHandler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + + +// Read from std::istream. +// + +std::[auto|unique]_ptr<type> +name (std::istream&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + +std::[auto|unique]_ptr<type> +name (std::istream&, +      xml_schema::error_handler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + +std::[auto|unique]_ptr<type> +name (std::istream&, +      xercesc::DOMErrorHandler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + + +std::[auto|unique]_ptr<type> +name (std::istream&, +      const std::basic_string<C>& id, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + +std::[auto|unique]_ptr<type> +name (std::istream&, +      const std::basic_string<C>& id, +      xml_schema::error_handler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + +std::[auto|unique]_ptr<type> +name (std::istream&, +      const std::basic_string<C>& id, +      xercesc::DOMErrorHandler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + + +// Read from InputSource. +// + +std::[auto|unique]_ptr<type> +name (xercesc::InputSource&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + +std::[auto|unique]_ptr<type> +name (xercesc::InputSource&, +      xml_schema::error_handler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + +std::[auto|unique]_ptr<type> +name (xercesc::InputSource&, +      xercesc::DOMErrorHandler&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + + +// Read from DOM. +// + +std::[auto|unique]_ptr<type> +name (const xercesc::DOMDocument&, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); + +std::[auto|unique]_ptr<type> +name (xml_schema::dom::[auto|unique]_ptr<xercesc::DOMDocument>, +      xml_schema::flags = 0, +      const xml_schema::properties& = xml_schema::properties ()); +  </pre> + +  <p>You can choose between reading an XML instance from a local file, +     URI, <code>std::istream</code>, <code>xercesc::InputSource</code>, +     or a pre-parsed DOM instance in the form of +     <code>xercesc::DOMDocument</code>. All the parsing functions +     return a dynamically allocated object model as either +     <code>std::auto_ptr</code> or <code>std::unique_ptr</code>, +     depending on the C++ standard selected. Each of these parsing +     functions is discussed in more detail in the following sections. +  </p> + +  <h2><a name="3.1">3.1 Initializing the Xerces-C++ Runtime</a></h2> + +  <p>Some parsing functions expect you to initialize the Xerces-C++ +     runtime while others initialize and terminate it as part of their +     work. The general rule is as follows: if a function has any arguments +     or return a value that is an instance of a Xerces-C++ type, then +     this function expects you to initialize the Xerces-C++ runtime. +     Otherwise, the function initializes and terminates the runtime for +     you. Note that it is legal to have nested calls to the Xerces-C++ +     initialize and terminate functions as long as the calls are balanced. +  </p> + +  <p>You can instruct parsing functions that initialize and terminate +     the runtime not to do so by passing the +     <code>xml_schema::flags::dont_initialize</code> flag (see +     <a href="#3.2">Section 3.2, "Flags and Properties"</a>). +  </p> + + +  <h2><a name="3.2">3.2 Flags and Properties</a></h2> + +  <p>Parsing flags and properties are the last two arguments of every +     parsing function. They allow you to fine-tune the process of +     instance validation and parsing. Both arguments are optional. +  </p> + + +  <p>The following flags are recognized by the parsing functions:</p> + +  <dl> +    <dt><code>xml_schema::flags::keep_dom</code></dt> +    <dd>Keep association between DOM nodes and the resulting +        object model nodes. For more information about DOM association +        refer to <a href="#5.1">Section 5.1, "DOM Association"</a>.</dd> + +    <dt><code>xml_schema::flags::own_dom</code></dt> +    <dd>Assume ownership of the DOM document passed. This flag only +        makes sense together with the <code>keep_dom</code> flag in +        the call to the parsing function with the +        <code>xml_schema::dom::[auto|unique]_ptr<DOMDocument></code> +        argument.</dd> + +    <dt><code>xml_schema::flags::dont_validate</code></dt> +    <dd>Do not validate instance documents against schemas.</dd> + +    <dt><code>xml_schema::flags::dont_initialize</code></dt> +    <dd>Do not initialize the Xerces-C++ runtime.</dd> +  </dl> + +  <p>You can pass several flags by combining them using the bit-wise OR +     operator. For example:</p> + +  <pre class="c++"> +using xml_schema::flags; + +std::auto_ptr<type> r ( +  name ("test.xml", flags::keep_dom | flags::dont_validate)); +  </pre> + +  <p>By default, validation of instance documents is turned on even +     though parsers generated by XSD do not assume instance +     documents are valid. They include a number of checks that prevent +     construction of inconsistent object models. This, +     however, does not mean that an instance document that was +     successfully parsed by the XSD-generated parsers is +     valid per the corresponding schema. If an instance document is not +     "valid enough" for the generated parsers to construct consistent +     object model, one of the exceptions defined in +     <code>xml_schema</code> namespace is thrown (see +     <a href="#3.3">Section 3.3, "Error Handling"</a>). +  </p> + +  <p>For more information on the Xerces-C++ runtime initialization +     refer to <a href="#3.1">Section 3.1, "Initializing the Xerces-C++ +     Runtime"</a>. +  </p> + +  <p>The <code>xml_schema::properties</code> class allows you to +     programmatically specify schema locations to be used instead +     of those specified with the <code>xsi::schemaLocation</code> +     and <code>xsi::noNamespaceSchemaLocation</code> attributes +     in instance documents. The interface of the <code>properties</code> +     class is presented below: +  </p> + +  <pre class="c++"> +class properties +{ +public: +  void +  schema_location (const std::basic_string<C>& namespace_, +                   const std::basic_string<C>& location); +  void +  no_namespace_schema_location (const std::basic_string<C>& location); +}; +  </pre> + +  <p>Note that all locations are relative to an instance document unless +     they are URIs. For example, if you want to use a local file as your +     schema, then you will need to pass +     <code>file:///absolute/path/to/your/schema</code> as the location +     argument. +  </p> + +  <h2><a name="3.3">3.3 Error Handling</a></h2> + +  <p>As discussed in <a href="#2.2">Section 2.2, "Error Handling"</a>, +     the mapping uses the C++ exception handling mechanism as its primary +     way of reporting error conditions. However, to handle recoverable +     parsing and validation errors and warnings, a callback interface maybe +     preferred by the application.</p> + +  <p>To better understand error handling and reporting strategies employed +     by the parsing functions, it is useful to know that the +     transformation of an XML instance document to a statically-typed +     tree happens in two stages. The first stage, performed by Xerces-C++, +     consists of parsing an XML document into a DOM instance. For short, +     we will call this stage the XML-DOM stage. Validation, if not disabled, +     happens during this stage. The second stage, +     performed by the generated parsers, consist of parsing the DOM +     instance into the statically-typed tree. We will call this stage +     the DOM-Tree stage. Additional checks are performed during this +     stage in order to prevent construction of inconsistent tree which +     could otherwise happen when validation is disabled, for example.</p> + +  <p>All parsing functions except the one that operates on a DOM instance +     come in overloaded triples. The first function in such a triple +     reports error conditions exclusively by throwing exceptions. It +     accumulates all the parsing and validation errors of the XML-DOM +     stage and throws them in a single instance of the +     <code>xml_schema::parsing</code> exception (described below). +     The second and the third functions in the triple use callback +     interfaces to report parsing and validation errors and warnings. +     The two callback interfaces are <code>xml_schema::error_handler</code> +     and <code>xercesc::DOMErrorHandler</code>. For more information +     on the <code>xercesc::DOMErrorHandler</code> interface refer to +     the Xerces-C++ documentation. The <code>xml_schema::error_handler</code> +     interface is presented below: +  </p> + +  <pre class="c++"> +class error_handler +{ +public: +  struct severity +  { +    enum value +    { +      warning, +      error, +      fatal +    }; +  }; + +  virtual bool +  handle (const std::basic_string<C>& id, +          unsigned long line, +          unsigned long column, +          severity, +          const std::basic_string<C>& message) = 0; + +  virtual +  ~error_handler (); +}; +  </pre> + +  <p>The <code>id</code> argument of the <code>error_handler::handle</code> +     function identifies the resource being parsed (e.g., a file name or +     URI). +  </p> + +  <p>By returning <code>true</code> from the <code>handle</code> function +     you instruct the parser to recover and continue parsing. Returning +     <code>false</code> results in termination of the parsing process. +     An error with the <code>fatal</code> severity level results in +     termination of the parsing process no matter what is returned from +     the <code>handle</code> function. It is safe to throw an exception +     from the <code>handle</code> function. +  </p> + +  <p>The DOM-Tree stage reports error conditions exclusively by throwing +     exceptions. Individual exceptions thrown by the parsing functions +     are described in the following sub-sections. +  </p> + + +  <h3><a name="3.3.1">3.3.1 <code>xml_schema::parsing</code></a></h3> + +  <pre class="c++"> +struct severity +{ +  enum value +  { +    warning, +    error +  }; + +  severity (value); +  operator value () const; +}; + +struct error +{ +  error (severity, +         const std::basic_string<C>& id, +         unsigned long line, +         unsigned long column, +         const std::basic_string<C>& message); + +  severity +  severity () const; + +  const std::basic_string<C>& +  id () const; + +  unsigned long +  line () const; + +  unsigned long +  column () const; + +  const std::basic_string<C>& +  message () const; +}; + +std::basic_ostream<C>& +operator<< (std::basic_ostream<C>&, const error&); + +struct diagnostics: std::vector<error> +{ +}; + +std::basic_ostream<C>& +operator<< (std::basic_ostream<C>&, const diagnostics&); + +struct parsing: virtual exception +{ +  parsing (); +  parsing (const diagnostics&); + +  const diagnostics& +  diagnostics () const; + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::parsing</code> exception is thrown if there +     were parsing or validation errors reported during the XML-DOM stage. +     If no callback interface was provided to the parsing function, the +     exception contains a list of errors and warnings accessible using +     the <code>diagnostics</code> function. The usual conditions when +     this exception is thrown include malformed XML instances and, if +     validation is turned on, invalid instance documents. +  </p> + +  <h3><a name="3.3.2">3.3.2 <code>xml_schema::expected_element</code></a></h3> + +  <pre class="c++"> +struct expected_element: virtual exception +{ +  expected_element (const std::basic_string<C>& name, +                    const std::basic_string<C>& namespace_); + + +  const std::basic_string<C>& +  name () const; + +  const std::basic_string<C>& +  namespace_ () const; + + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::expected_element</code> exception is thrown +     when an expected element is not encountered by the DOM-Tree stage. +     The name and namespace of the expected element can be obtained using +     the <code>name</code> and <code>namespace_</code> functions respectively. +  </p> + + +  <h3><a name="3.3.3">3.3.3 <code>xml_schema::unexpected_element</code></a></h3> + +  <pre class="c++"> +struct unexpected_element: virtual exception +{ +  unexpected_element (const std::basic_string<C>& encountered_name, +                      const std::basic_string<C>& encountered_namespace, +                      const std::basic_string<C>& expected_name, +                      const std::basic_string<C>& expected_namespace) + + +  const std::basic_string<C>& +  encountered_name () const; + +  const std::basic_string<C>& +  encountered_namespace () const; + + +  const std::basic_string<C>& +  expected_name () const; + +  const std::basic_string<C>& +  expected_namespace () const; + + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::unexpected_element</code> exception is thrown +     when an unexpected element is encountered by the DOM-Tree stage. +     The name and namespace of the encountered element can be obtained +     using the <code>encountered_name</code> and +     <code>encountered_namespace</code> functions respectively. If an +     element was expected instead of the encountered one, its name +     and namespace can be obtained using the <code>expected_name</code> and +     <code>expected_namespace</code> functions respectively. Otherwise +     these functions return empty strings. +  </p> + +  <h3><a name="3.3.4">3.3.4 <code>xml_schema::expected_attribute</code></a></h3> + +  <pre class="c++"> +struct expected_attribute: virtual exception +{ +  expected_attribute (const std::basic_string<C>& name, +                      const std::basic_string<C>& namespace_); + + +  const std::basic_string<C>& +  name () const; + +  const std::basic_string<C>& +  namespace_ () const; + + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::expected_attribute</code> exception is thrown +     when an expected attribute is not encountered by the DOM-Tree stage. +     The name and namespace of the expected attribute can be obtained using +     the <code>name</code> and <code>namespace_</code> functions respectively. +  </p> + + +  <h3><a name="3.3.5">3.3.5 <code>xml_schema::unexpected_enumerator</code></a></h3> + +  <pre class="c++"> +struct unexpected_enumerator: virtual exception +{ +  unexpected_enumerator (const std::basic_string<C>& enumerator); + +  const std::basic_string<C>& +  enumerator () const; + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::unexpected_enumerator</code> exception is thrown +     when an unexpected enumerator is encountered by the DOM-Tree stage. +     The enumerator can be obtained using the <code>enumerator</code> +     functions. +  </p> + +  <h3><a name="3.3.6">3.3.6 <code>xml_schema::expected_text_content</code></a></h3> + +  <pre class="c++"> +struct expected_text_content: virtual exception +{ +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::expected_text_content</code> exception is thrown +     when a content other than text is encountered and the text content was +     expected by the DOM-Tree stage. +  </p> + +  <h3><a name="3.3.7">3.3.7 <code>xml_schema::no_type_info</code></a></h3> + +  <pre class="c++"> +struct no_type_info: virtual exception +{ +  no_type_info (const std::basic_string<C>& type_name, +                const std::basic_string<C>& type_namespace); + +  const std::basic_string<C>& +  type_name () const; + +  const std::basic_string<C>& +  type_namespace () const; + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::no_type_info</code> exception is thrown +     when there is no type information associated with a type specified +     by the <code>xsi:type</code> attribute. This exception is thrown +     by the DOM-Tree stage. The name and namespace of the type in question +     can be obtained using the <code>type_name</code> and +     <code>type_namespace</code> functions respectively. Usually, catching +     this exception means that you haven't linked the code generated +     from the schema defining the type in question with your application +     or this schema has been compiled without the +     <code>--generate-polymorphic</code> option. +  </p> + + +  <h3><a name="3.3.8">3.3.8 <code>xml_schema::not_derived</code></a></h3> + +  <pre class="c++"> +struct not_derived: virtual exception +{ +  not_derived (const std::basic_string<C>& base_type_name, +               const std::basic_string<C>& base_type_namespace, +               const std::basic_string<C>& derived_type_name, +               const std::basic_string<C>& derived_type_namespace); + +  const std::basic_string<C>& +  base_type_name () const; + +  const std::basic_string<C>& +  base_type_namespace () const; + + +  const std::basic_string<C>& +  derived_type_name () const; + +  const std::basic_string<C>& +  derived_type_namespace () const; + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::not_derived</code> exception is thrown +     when a type specified by the <code>xsi:type</code> attribute is +     not derived from the expected base type. This exception is thrown +     by the DOM-Tree stage. The name and namespace of the expected +     base type can be obtained using the <code>base_type_name</code> and +     <code>base_type_namespace</code> functions respectively. The name +     and namespace of the offending type can be obtained using the +     <code>derived_type_name</code> and +     <code>derived_type_namespace</code> functions respectively. +  </p> + +  <h3><a name="3.3.9">3.3.9 <code>xml_schema::no_prefix_mapping</code></a></h3> + +  <pre class="c++"> +struct no_prefix_mapping: virtual exception +{ +  no_prefix_mapping (const std::basic_string<C>& prefix); + +  const std::basic_string<C>& +  prefix () const; + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::no_prefix_mapping</code> exception is thrown +     during the DOM-Tree stage if a namespace prefix is encountered for +     which a prefix-namespace mapping hasn't been provided. The namespace +     prefix in question can be obtained using the <code>prefix</code> +     function. +  </p> + +  <h2><a name="3.4">3.4 Reading from a Local File or URI</a></h2> + +  <p>Using a local file or URI is the simplest way to parse an XML instance. +     For example:</p> + +  <pre class="c++"> +using std::auto_ptr; + +auto_ptr<type> r1 (name ("test.xml")); +auto_ptr<type> r2 (name ("http://www.codesynthesis.com/test.xml")); +  </pre> + +  <p>Or, in the C++11 mode:</p> + +  <pre class="c++"> +using std::unique_ptr; + +unique_ptr<type> r1 (name ("test.xml")); +unique_ptr<type> r2 (name ("http://www.codesynthesis.com/test.xml")); +  </pre> + +  <h2><a name="3.5">3.5 Reading from <code>std::istream</code></a></h2> + +  <p>When using an <code>std::istream</code> instance, you may also +     pass an optional resource id. This id is used to identify the +     resource (for example in error messages) as well as to resolve +     relative paths. For instance:</p> + +  <pre class="c++"> +using std::auto_ptr; + +{ +  std::ifstream ifs ("test.xml"); +  auto_ptr<type> r (name (ifs, "test.xml")); +} + +{ +  std::string str ("..."); // Some XML fragment. +  std::istringstream iss (str); +  auto_ptr<type> r (name (iss)); +} +  </pre> + +  <h2><a name="3.6">3.6 Reading from <code>xercesc::InputSource</code></a></h2> + +  <p>Reading from a <code>xercesc::InputSource</code> instance +     is similar to the <code>std::istream</code> case except +     the resource id is maintained by the <code>InputSource</code> +     object. For instance:</p> + +  <pre class="c++"> +xercesc::StdInInputSource is; +std::auto_ptr<type> r (name (is)); +  </pre> + +  <h2><a name="3.7">3.7 Reading from DOM</a></h2> + +  <p>Reading from a <code>xercesc::DOMDocument</code> instance allows +     you to setup a custom XML-DOM stage. Things like DOM +     parser reuse, schema pre-parsing, and schema caching can be achieved +     with this approach. For more information on how to obtain DOM +     representation from an XML instance refer to the Xerces-C++ +     documentation. In addition, the +     <a href="http://wiki.codesynthesis.com/Tree/FAQ">C++/Tree Mapping +     FAQ</a> shows how to parse an XML instance to a Xerces-C++ +     DOM document using the XSD runtime utilities. +  </p> + +  <p>The last parsing function is useful when you would like to perform +     your own XML-to-DOM parsing and associate the resulting DOM document +     with the object model nodes. The automatic <code>DOMDocument</code> +     pointer is reset and the resulting object model assumes ownership +     of the DOM document passed. For example:</p> + +  <pre class="c++"> +// C++98 version. +// +xml_schema::dom::auto_ptr<xercesc::DOMDocument> doc = ... + +std::auto_ptr<type> r ( +  name (doc, xml_schema::flags::keep_dom | xml_schema::flags::own_dom)); + +// At this point doc is reset to 0. + +// C++11 version. +// +xml_schema::dom::unique_ptr<xercesc::DOMDocument> doc = ... + +std::unique_ptr<type> r ( +  name (std::move (doc), +        xml_schema::flags::keep_dom | xml_schema::flags::own_dom)); + +// At this point doc is reset to 0. +  </pre> + +  <h1><a name="4">4 Serialization</a></h1> + +  <p>This chapter covers various aspects of serializing a +     tree-like object model to DOM or XML. +     In this regard, serialization is complimentary to the reverse +     process of parsing a DOM or XML instance into an object model +     which is discussed in <a href="#3">Chapter 3, +     "Parsing"</a>. Note that the generation of the serialization code +     is optional and should be explicitly requested with the +     <code>--generate-serialization</code> option. See the +     <a href="http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml">XSD +     Compiler Command Line Manual</a> for more information. +  </p> + +  <p>Each global XML Schema element in the form: +  </p> + + +  <pre class="xml"> +<xsd:element name="name" type="type"/> +  </pre> + +  <p>is mapped to 8 overloaded C++ functions in the form:</p> + +  <pre class="c++"> +// Serialize to std::ostream. +// +void +name (std::ostream&, +      const type&, +      const xml_schema::namespace_fomap& = +        xml_schema::namespace_infomap (), +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0); + +void +name (std::ostream&, +      const type&, +      xml_schema::error_handler&, +      const xml_schema::namespace_infomap& = +        xml_schema::namespace_infomap (), +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0); + +void +name (std::ostream&, +      const type&, +      xercesc::DOMErrorHandler&, +      const xml_schema::namespace_infomap& = +        xml_schema::namespace_infomap (), +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0); + + +// Serialize to XMLFormatTarget. +// +void +name (xercesc::XMLFormatTarget&, +      const type&, +      const xml_schema::namespace_infomap& = +        xml_schema::namespace_infomap (), +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0); + +void +name (xercesc::XMLFormatTarget&, +      const type&, +      xml_schema::error_handler&, +      const xml_schema::namespace_infomap& = +        xml_schema::namespace_infomap (), +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0); + +void +name (xercesc::XMLFormatTarget&, +      const type&, +      xercesc::DOMErrorHandler&, +      const xml_schema::namespace_infomap& = +        xml_schema::namespace_infomap (), +      const std::basic_string<C>& encoding = "UTF-8", +      xml_schema::flags = 0); + + +// Serialize to DOM. +// +xml_schema::dom::[auto|unique]_ptr<xercesc::DOMDocument> +name (const type&, +      const xml_schema::namespace_infomap& +        xml_schema::namespace_infomap (), +      xml_schema::flags = 0); + +void +name (xercesc::DOMDocument&, +      const type&, +      xml_schema::flags = 0); +  </pre> + +  <p>You can choose between writing XML to <code>std::ostream</code> or +     <code>xercesc::XMLFormatTarget</code> and creating a DOM instance +     in the form of <code>xercesc::DOMDocument</code>. Serialization +     to <code>ostream</code> or <code>XMLFormatTarget</code> requires a +     considerably less work while serialization to DOM provides +     for greater flexibility. Each of these serialization functions +     is discussed in more detail in the following sections. +  </p> + + +  <h2><a name="4.1">4.1 Initializing the Xerces-C++ Runtime</a></h2> + +  <p>Some serialization functions expect you to initialize the Xerces-C++ +     runtime while others initialize and terminate it as part of their +     work. The general rule is as follows: if a function has any arguments +     or return a value that is an instance of a Xerces-C++ type, then +     this function expects you to initialize the Xerces-C++ runtime. +     Otherwise, the function initializes and terminates the runtime for +     you. Note that it is legal to have nested calls to the Xerces-C++ +     initialize and terminate functions as long as the calls are balanced. +  </p> + +  <p>You can instruct serialization functions that initialize and terminate +     the runtime not to do so by passing the +     <code>xml_schema::flags::dont_initialize</code> flag (see +     <a href="#4.3">Section 4.3, "Flags"</a>). +  </p> + +  <h2><a name="4.2">4.2 Namespace Infomap and Character Encoding</a></h2> + +  <p>When a document being serialized uses XML namespaces, custom +     prefix-namespace associations can to be established. If custom +     prefix-namespace mapping is not provided then generic prefixes +     (<code>p1</code>, <code>p2</code>, etc) are automatically assigned +     to namespaces as needed. Also, if +     you would like the resulting instance document to contain the +     <code>schemaLocation</code> or <code>noNamespaceSchemaLocation</code> +     attributes, you will need to provide namespace-schema associations. +     The <code>xml_schema::namespace_infomap</code> class is used +     to capture this information:</p> + +  <pre class="c++"> +struct namespace_info +{ +  namespace_info (); +  namespace_info (const std::basic_string<C>& name, +                  const std::basic_string<C>& schema); + +  std::basic_string<C> name; +  std::basic_string<C> schema; +}; + +// Map of namespace prefix to namespace_info. +// +struct namespace_infomap: public std::map<std::basic_string<C>, +                                          namespace_info> +{ +}; +  </pre> + +  <p>Consider the following associations as an example:</p> + +  <pre class="c++"> +xml_schema::namespace_infomap map; + +map["t"].name = "http://www.codesynthesis.com/test"; +map["t"].schema = "test.xsd"; +  </pre> + +  <p>This map, if passed to one of the serialization functions, +     could result in the following XML fragment:</p> + +  <pre class="xml"> +<?xml version="1.0" ?> +<t:name xmlns:t="http://www.codesynthesis.com/test" +        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +        xsi:schemaLocation="http://www.codesynthesis.com/test test.xsd"> +  </pre> + +  <p>As you can see, the serialization function automatically added namespace +     mapping for the <code>xsi</code> prefix. You can change this by +     providing your own prefix:</p> + +  <pre class="c++"> +xml_schema::namespace_infomap map; + +map["xsn"].name = "http://www.w3.org/2001/XMLSchema-instance"; + +map["t"].name = "http://www.codesynthesis.com/test"; +map["t"].schema = "test.xsd"; +  </pre> + +  <p>This could result in the following XML fragment:</p> + +  <pre class="xml"> +<?xml version="1.0" ?> +<t:name xmlns:t="http://www.codesynthesis.com/test" +        xmlns:xsn="http://www.w3.org/2001/XMLSchema-instance" +        xsn:schemaLocation="http://www.codesynthesis.com/test test.xsd"> +  </pre> + +  <p>To specify the location of a schema without a namespace you can use +     an empty prefix as in the example below: </p> + +  <pre class="c++"> +xml_schema::namespace_infomap map; + +map[""].schema = "test.xsd"; +  </pre> + +  <p>This would result in the following XML fragment:</p> + +  <pre class="xml"> +<?xml version="1.0" ?> +<name xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +      xsi:noNamespaceSchemaLocation="test.xsd"> +  </pre> + +  <p>To make a particular namespace default you can use an empty +     prefix, for example:</p> + +  <pre class="c++"> +xml_schema::namespace_infomap map; + +map[""].name = "http://www.codesynthesis.com/test"; +map[""].schema = "test.xsd"; +  </pre> + +  <p>This could result in the following XML fragment:</p> + +  <pre class="xml"> +<?xml version="1.0" ?> +<name xmlns="http://www.codesynthesis.com/test" +      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +      xsi:schemaLocation="http://www.codesynthesis.com/test test.xsd"> +  </pre> + + +  <p>Another bit of information that you can pass to the serialization +     functions is the character encoding method that you would like to use. +     Common values for this argument are <code>"US-ASCII"</code>, +     <code>"ISO8859-1"</code>, <code>"UTF-8"</code>, +     <code>"UTF-16BE"</code>, <code>"UTF-16LE"</code>, +     <code>"UCS-4BE"</code>, and <code>"UCS-4LE"</code>. The default +     encoding is <code>"UTF-8"</code>. For more information on +     encoding methods see the +     "<a href="http://en.wikipedia.org/wiki/Character_code">Character +     Encoding</a>" article from Wikipedia. +  </p> + +  <h2><a name="4.3">4.3 Flags</a></h2> + +  <p>Serialization flags are the last argument of every serialization +     function. They allow you to fine-tune the process of serialization. +     The flags argument is optional. +  </p> + + +  <p>The following flags are recognized by the serialization +     functions:</p> + +  <dl> +    <dt><code>xml_schema::flags::dont_initialize</code></dt> +    <dd>Do not initialize the Xerces-C++ runtime.</dd> + +    <dt><code>xml_schema::flags::dont_pretty_print</code></dt> +    <dd>Do not add extra spaces or new lines that make the resulting XML +        slightly bigger but easier to read.</dd> + +    <dt><code>xml_schema::flags::no_xml_declaration</code></dt> +    <dd>Do not write XML declaration (<?xml ... ?>).</dd> +  </dl> + +  <p>You can pass several flags by combining them using the bit-wise OR +     operator. For example:</p> + +  <pre class="c++"> +std::auto_ptr<type> r = ... +std::ofstream ofs ("test.xml"); +xml_schema::namespace_infomap map; +name (ofs, +      *r, +      map, +      "UTF-8", +      xml_schema::flags::no_xml_declaration | +      xml_schema::flags::dont_pretty_print); +  </pre> + +  <p>For more information on the Xerces-C++ runtime initialization +     refer to <a href="#4.1">Section 4.1, "Initializing the Xerces-C++ +     Runtime"</a>. +  </p> + +  <h2><a name="4.4">4.4 Error Handling</a></h2> + +  <p>As with the parsing functions (see <a href="#3.3">Section 3.3, +     "Error Handling"</a>), to better understand error handling and +     reporting strategies employed by the serialization functions, it +     is useful to know that the transformation of a statically-typed +     tree to an XML instance document happens in two stages. The first +     stage, performed by the generated code, consist of building a DOM +     instance from the statically-typed tree . For short, we will call +     this stage the Tree-DOM stage. The second stage, performed by +     Xerces-C++, consists of serializing the DOM instance into the XML +     document. We will call this stage the DOM-XML stage. +  </p> + +  <p>All serialization functions except the two that serialize into +     a DOM instance come in overloaded triples. The first function +     in such a triple reports error conditions exclusively by throwing +     exceptions. It accumulates all the serialization errors of the +     DOM-XML stage and throws them in a single instance of the +     <code>xml_schema::serialization</code> exception (described below). +     The second and the third functions in the triple use callback +     interfaces to report serialization errors and warnings. The two +     callback interfaces are <code>xml_schema::error_handler</code> and +     <code>xercesc::DOMErrorHandler</code>. The +     <code>xml_schema::error_handler</code> interface is described in +     <a href="#3.3">Section 3.3, "Error Handling"</a>. For more information +     on the <code>xercesc::DOMErrorHandler</code> interface refer to the +     Xerces-C++ documentation. +  </p> + +  <p>The Tree-DOM stage reports error conditions exclusively by throwing +     exceptions. Individual exceptions thrown by the serialization functions +     are described in the following sub-sections. +  </p> + +  <h3><a name="4.4.1">4.4.1 <code>xml_schema::serialization</code></a></h3> + +  <pre class="c++"> +struct serialization: virtual exception +{ +  serialization (); +  serialization (const diagnostics&); + +  const diagnostics& +  diagnostics () const; + +  virtual const char* +  what () const throw (); +}; +  </pre> + +  <p>The <code>xml_schema::diagnostics</code> class is described in +     <a href="#3.3.1">Section 3.3.1, "<code>xml_schema::parsing</code>"</a>. +     The <code>xml_schema::serialization</code> exception is thrown if +     there were serialization errors reported during the DOM-XML stage. +     If no callback interface was provided to the serialization function, +     the exception contains a list of errors and warnings accessible using +     the <code>diagnostics</code> function. +  </p> + + +  <h3><a name="4.4.2">4.4.2 <code>xml_schema::unexpected_element</code></a></h3> + +  <p>The <code>xml_schema::unexpected_element</code> exception is +     described in <a href="#3.3.3">Section 3.3.3, +     "<code>xml_schema::unexpected_element</code>"</a>. It is thrown +     by the serialization functions during the Tree-DOM stage if the +     root element name of the provided DOM instance does not match with +     the name of the element this serialization function is for. +  </p> + +  <h3><a name="4.4.3">4.4.3 <code>xml_schema::no_type_info</code></a></h3> + +  <p>The <code>xml_schema::no_type_info</code> exception is +     described in <a href="#3.3.7">Section 3.3.7, +     "<code>xml_schema::no_type_info</code>"</a>. It is thrown +     by the serialization functions during the Tree-DOM stage when there +     is no type information associated with a dynamic type of an +     element. Usually, catching this exception means that you haven't +     linked the code generated from the schema defining the type in +     question with your application or this schema has been compiled +     without the <code>--generate-polymorphic</code> option. +  </p> + +  <h2><a name="4.5">4.5 Serializing to <code>std::ostream</code></a></h2> + +  <p>In order to serialize to <code>std::ostream</code> you will need +     an object model, an output stream and, optionally, a namespace +     infomap. For instance:</p> + +  <pre class="c++"> +// Obtain the object model. +// +std::auto_ptr<type> r = ... + +// Prepare namespace mapping and schema location information. +// +xml_schema::namespace_infomap map; + +map["t"].name = "http://www.codesynthesis.com/test"; +map["t"].schema = "test.xsd"; + +// Write it out. +// +name (std::cout, *r, map); +  </pre> + +  <p>Note that the output stream is treated as a binary stream. This +     becomes important when you use a character encoding that is wider +     than 8-bit <code>char</code>, for instance UTF-16 or UCS-4. For +     example, things will most likely break if you try to serialize +     to <code>std::ostringstream</code> with UTF-16 or UCS-4 as an +     encoding. This is due to the special value, +     <code>'\0'</code>, that will most likely occur as part of such +     serialization and it won't have the special meaning assumed by +     <code>std::ostringstream</code>. +  </p> + + +  <h2><a name="4.6">4.6 Serializing to <code>xercesc::XMLFormatTarget</code></a></h2> + +  <p>Serializing to an <code>xercesc::XMLFormatTarget</code> instance +     is similar the <code>std::ostream</code> case. For instance: +  </p> + +  <pre class="c++"> +using std::auto_ptr; + +// Obtain the object model. +// +auto_ptr<type> r = ... + +// Prepare namespace mapping and schema location information. +// +xml_schema::namespace_infomap map; + +map["t"].name = "http://www.codesynthesis.com/test"; +map["t"].schema = "test.xsd"; + +using namespace xercesc; + +XMLPlatformUtils::Initialize (); + +{ +  // Choose a target. +  // +  auto_ptr<XMLFormatTarget> ft; + +  if (argc != 2) +  { +    ft = auto_ptr<XMLFormatTarget> (new StdOutFormatTarget ()); +  } +  else +  { +    ft = auto_ptr<XMLFormatTarget> ( +      new LocalFileFormatTarget (argv[1])); +  } + +  // Write it out. +  // +  name (*ft, *r, map); +} + +XMLPlatformUtils::Terminate (); +  </pre> + +  <p>Note that we had to initialize the Xerces-C++ runtime before we +     could call this serialization function.</p> + +  <h2><a name="4.7">4.7 Serializing to DOM</a></h2> + +  <p>The mapping provides two overloaded functions that implement +     serialization to a DOM instance. The first creates a DOM instance +     for you and the second serializes to an existing DOM instance. +     While serializing to a new DOM instance is similar to serializing +     to <code>std::ostream</code> or <code>xercesc::XMLFormatTarget</code>, +     serializing to an existing DOM instance requires quite a bit of work +     from your side. You will need to set all the custom namespace mapping +     attributes as well as the <code>schemaLocation</code> and/or +     <code>noNamespaceSchemaLocation</code> attributes. The following +     listing should give you an idea about what needs to be done: +  </p> + +  <pre class="c++"> +// Obtain the object model. +// +std::auto_ptr<type> r = ... + +using namespace xercesc; + +XMLPlatformUtils::Initialize (); + +{ +  // Create a DOM instance. Set custom namespace mapping and schema +  // location attributes. +  // +  DOMDocument& doc = ... + +  // Serialize to DOM. +  // +  name (doc, *r); + +  // Serialize the DOM document to XML. +  // +  ... +} + +XMLPlatformUtils::Terminate (); +  </pre> + +  <p>For more information on how to create and serialize a DOM instance +     refer to the Xerces-C++ documentation. In addition, the +     <a href="http://wiki.codesynthesis.com/Tree/FAQ">C++/Tree Mapping +     FAQ</a> shows how to implement these operations using the XSD +     runtime utilities. +  </p> + +  <h1><a name="5">5 Additional Functionality</a></h1> + +  <p>The C++/Tree mapping provides a number of optional features +     that can be useful in certain situations. They are described +     in the following sections.</p> + +  <h2><a name="5.1">5.1 DOM Association</a></h2> + +  <p>Normally, after parsing is complete, the DOM document which +     was used to extract the data is discarded. However, the parsing +     functions can be instructed to preserve the DOM document +     and create an association between the DOM nodes and object model +     nodes. When there is an association between the DOM and +     object model nodes, you can obtain the corresponding DOM element +     or attribute node from an object model node as well as perform +     the reverse transition: obtain the corresponding object model +     from a DOM element or attribute node.</p> + +  <p>Maintaining DOM association is normally useful when the application +     needs access to XML constructs that are not preserved in the +     object model, for example, XML comments. +     Another useful aspect of DOM association is the ability of the +     application to navigate the document tree using the generic DOM +     interface (for example, with the help of an XPath processor) +     and then move back to the statically-typed object model. Note +     also that while you can change the underlying DOM document, +     these changes are not reflected in the object model and will +     be ignored during serialization. If you need to not only access +     but also modify some aspects of XML that are not preserved in +     the object model, then type customization with custom parsing +     constructors and serialization operators should be used instead.</p> + +  <p>To request DOM association you will need to pass the +     <code>xml_schema::flags::keep_dom</code> flag to one of the +     parsing functions (see <a href="#3.2">Section 3.2, +     "Flags and Properties"</a> for more information). In this case the +     DOM document is retained and will be released when the object model +     is deleted. Note that since DOM nodes "out-live" the parsing function +     call, you need to initialize the Xerces-C++ runtime before calling +     one of the parsing functions with the <code>keep_dom</code> flag and +     terminate it after the object model is destroyed (see +     <a href="#3.1">Section 3.1, "Initializing the Xerces-C++ Runtime"</a>).</p> + +   <p>If the <code>keep_dom</code> flag is passed +      as the second argument to the copy constructor and the copy +      being made is of a complete tree, then the DOM association +      is also maintained in the copy by cloning the underlying +      DOM document and reestablishing the associations. For example:</p> + +  <pre class="c++"> +using namespace xercesc; + +XMLPlatformUtils::Initialize (); + +{ +  // Parse XML to object model. +  // +  std::auto_ptr<type> r (root ( +    "root.xml", +     xml_schema::flags::keep_dom | +     xml_schema::flags::dont_initialize)); + +   // Copy without DOM association. +   // +   type copy1 (*r); + +   // Copy with DOM association. +   // +   type copy2 (*r, xml_schema::flags::keep_dom); +} + +XMLPlatformUtils::Terminate (); +  </pre> + + +  <p>To obtain the corresponding DOM node from an object model node +     you will need to call the <code>_node</code> accessor function +     which returns a pointer to <code>DOMNode</code>. You can then query +     this DOM node's type and cast it to either <code>DOMAttr*</code> +     or <code>DOMElement*</code>. To obtain the corresponding object +     model node from a DOM node, the DOM user data API is used. The +     <code>xml_schema::dom::tree_node_key</code> variable contains +     the key for object model nodes. The following schema and code +     fragment show how to navigate from DOM to object model nodes +     and in the opposite direction:</p> + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    <element name="a" type="string"/> +  </sequence> +</complexType> + +<element name="root" type="object"/> +  </pre> + +  <pre class="c++"> +using namespace xercesc; + +XMLPlatformUtils::Initialize (); + +{ +  // Parse XML to object model. +  // +  std::auto_ptr<type> r (root ( +    "root.xml", +     xml_schema::flags::keep_dom | +     xml_schema::flags::dont_initialize)); + +  DOMNode* n = root->_node (); +  assert (n->getNodeType () == DOMNode::ELEMENT_NODE); +  DOMElement* re = static_cast<DOMElement*> (n); + +  // Get the 'a' element. Note that it is not necessarily the +  // first child node of 'root' since there could be whitespace +  // nodes before it. +  // +  DOMElement* ae; + +  for (n = re->getFirstChild (); n != 0; n = n->getNextSibling ()) +  { +    if (n->getNodeType () == DOMNode::ELEMENT_NODE) +    { +      ae = static_cast<DOMElement*> (n); +      break; +    } +  } + +  // Get from the 'a' DOM element to xml_schema::string object model +  // node. +  // +  xml_schema::type& t ( +    *reinterpret_cast<xml_schema::type*> ( +       ae->getUserData (xml_schema::dom::tree_node_key))); + +  xml_schema::string& a (dynamic_cast<xml_schema::string&> (t)); +} + +XMLPlatformUtils::Terminate (); +  </pre> + +  <p>The 'mixed' example which can be found in the XSD distribution +     shows how to handle the mixed content using DOM association.</p> + +  <h2><a name="5.2">5.2 Binary Serialization</a></h2> + +  <p>Besides reading from and writing to XML, the C++/Tree mapping +     also allows you to save the object model to and load it from a +     number of predefined as well as custom data representation +     formats. The predefined binary formats are CDR (Common Data +     Representation) and XDR (eXternal Data Representation). A +     custom format can easily be supported by providing +     insertion and extraction operators for basic types.</p> + +  <p>Binary serialization saves only the data without any meta +     information or markup. As a result, saving to and loading +     from a binary representation can be an order of magnitude +     faster than parsing and serializing the same data in XML. +     Furthermore, the resulting representation is normally several +     times smaller than the equivalent XML representation. These +     properties make binary serialization ideal for internal data +     exchange and storage. A typical application that uses this +     facility stores the data and communicates within the +     system using a binary format and reads/writes the data +     in XML when communicating with the outside world.</p> + +  <p>In order to request the generation of insertion operators and +     extraction constructors for a specific predefined or custom +     data representation stream, you will need to use the +     <code>--generate-insertion</code> and <code>--generate-extraction</code> +     compiler options. See the +     <a href="http://www.codesynthesis.com/projects/xsd/documentation/xsd.xhtml">XSD +     Compiler Command Line Manual</a> for more information.</p> + +  <p>Once the insertion operators and extraction constructors are +     generated, you can use the <code>xml_schema::istream</code> +     and <code>xml_schema::ostream</code> wrapper stream templates +     to save the object model to and load it from a specific format. +     The following code fragment shows how to do this using ACE +     (Adaptive Communication Environment) CDR streams as an example:</p> + +  <pre class="xml"> +<complexType name="object"> +  <sequence> +    <element name="a" type="string"/> +    <element name="b" type="int"/> +  </sequence> +</complexType> + +<element name="root" type="object"/> +  </pre> + +  <pre class="c++"> +// Parse XML to object model. +// +std::auto_ptr<type> r (root ("root.xml")); + +// Save to a CDR stream. +// +ACE_OutputCDR ace_ocdr; +xml_schema::ostream<ACE_OutputCDR> ocdr (ace_ocdr); + +ocdr << *r; + +// Load from a CDR stream. +// +ACE_InputCDR ace_icdr (buf, size); +xml_schema::istream<ACE_InputCDR> icdr (ace_icdr); + +std::auto_ptr<object> copy (new object (icdr)); + +// Serialize to XML. +// +root (std::cout, *copy); +  </pre> + +  <p>The XSD distribution contains a number of examples that +     show how to save the object model to and load it from +     CDR, XDR, and a custom format.</p> + +  <!--  Appendix A --> + + +  <h1><a name="A">Appendix A — Default and Fixed Values</a></h1> + +  <p>The following table summarizes the effect of default and fixed +     values (specified with the <code>default</code> and <code>fixed</code> +     attributes, respectively) on attribute and element values. The +     <code>default</code> and <code>fixed</code> attributes are mutually +     exclusive. It is also worthwhile to note that the fixed value semantics +     is a superset of the default value semantics. +  </p> + +  <!-- border="1" is necessary for html2ps --> +  <table id="default-fixed" border="1"> +    <tr> +      <th></th> +      <th></th> +      <th colspan="2">default</th> +      <th colspan="2">fixed</th> +    </tr> + +    <!-- element --> + +    <tr> +      <th rowspan="4">element</th> +      <th rowspan="2">not present</th> +      <th>optional</th> +      <th>required</th> +      <th>optional</th> +      <th>required</th> +    </tr> +    <tr> +      <td>not present</td> +      <td>invalid instance</td> +      <td>not present</td> +      <td>invalid instance</td> +    </tr> + + +    <tr> +      <th>empty</th> +      <td colspan="2">default value is used</td> +      <td colspan="2">fixed value is used</td> +    </tr> + +    <tr> +      <th>value</th> +      <td colspan="2">value is used</td> +      <td colspan="2">value is used provided it's the same as fixed</td> +    </tr> + +    <!-- attribute --> + +    <!-- element --> + +    <tr> +      <th rowspan="4">attribute</th> +      <th rowspan="2">not present</th> +      <th>optional</th> +      <th>required</th> +      <th>optional</th> +      <th>required</th> +    </tr> +    <tr> +      <td>default value is used</td> +      <td>invalid schema</td> +      <td>fixed value is used</td> +      <td>invalid instance</td> +    </tr> + + +    <tr> +      <th>empty</th> +      <td colspan="2">empty value is used</td> +      <td colspan="2">empty value is used provided it's the same as fixed</td> +    </tr> + +    <tr> +      <th>value</th> +      <td colspan="2">value is used</td> +      <td colspan="2">value is used provided it's the same as fixed</td> +    </tr> + +  </table> + +  </div> +</div> + + +</body> +</html> diff --git a/xsd/doc/cxx/tree/manual/makefile b/xsd/doc/cxx/tree/manual/makefile new file mode 100644 index 0000000..3cb0d80 --- /dev/null +++ b/xsd/doc/cxx/tree/manual/makefile @@ -0,0 +1,54 @@ +# file      : doc/cxx/tree/manual/makefile +# copyright : Copyright (c) 2006-2014 Code Synthesis Tools CC +# license   : GNU GPL v2 + exceptions; see accompanying LICENSE file + +include $(dir $(lastword $(MAKEFILE_LIST)))../../../../build/bootstrap.make + +default  := $(out_base)/ +install  := $(out_base)/.install +dist     := $(out_base)/.dist +dist-win := $(out_base)/.dist-win +clean    := $(out_base)/.clean + +# Build. +# +$(default): $(out_base)/cxx-tree-manual.ps $(out_base)/cxx-tree-manual.pdf + + +$(out_base)/cxx-tree-manual.ps: $(src_base)/index.xhtml   \ +                                $(src_base)/manual.html2ps \ +                                | $(out_base)/. +	$(call message,html2ps $<,html2ps -f $(src_base)/manual.html2ps -o $@ $<) + +$(out_base)/cxx-tree-manual.pdf: $(out_base)/cxx-tree-manual.ps | $(out_base)/. +	$(call message,ps2pdf $<,ps2pdf14 $< $@) + +# Install & Dist. +# +$(install): path := $(subst $(src_root)/doc/,,$(src_base)) +$(dist): path := $(subst $(src_root)/,,$(src_base)) + +$(install): $(out_base)/cxx-tree-manual.ps $(out_base)/cxx-tree-manual.pdf +	$(call install-data,$(src_base)/index.xhtml,$(install_doc_dir)/xsd/$(path)/index.xhtml) +	$(call install-data,$(out_base)/cxx-tree-manual.ps,$(install_doc_dir)/xsd/$(path)/cxx-tree-manual.ps) +	$(call install-data,$(out_base)/cxx-tree-manual.pdf,$(install_doc_dir)/xsd/$(path)/cxx-tree-manual.pdf) + +$(dist): $(out_base)/cxx-tree-manual.ps $(out_base)/cxx-tree-manual.pdf +	$(call install-data,$(src_base)/index.xhtml,$(dist_prefix)/$(path)/index.xhtml) +	$(call install-data,$(out_base)/cxx-tree-manual.ps,$(dist_prefix)/$(path)/cxx-tree-manual.ps) +	$(call install-data,$(out_base)/cxx-tree-manual.pdf,$(dist_prefix)/$(path)/cxx-tree-manual.pdf) + +$(dist-win): $(dist) + + +# Clean +# +$(clean): +ifneq ($(xsd_clean_gen),n) +	$(call message,rm $$1,rm -f $$1,$(out_base)/cxx-tree-manual.ps) +	$(call message,rm $$1,rm -f $$1,$(out_base)/cxx-tree-manual.pdf) +endif + +# How to. +# +$(call include,$(bld_root)/install.make) diff --git a/xsd/doc/cxx/tree/manual/manual.html2ps b/xsd/doc/cxx/tree/manual/manual.html2ps new file mode 100644 index 0000000..6e714a6 --- /dev/null +++ b/xsd/doc/cxx/tree/manual/manual.html2ps @@ -0,0 +1,66 @@ +@html2ps { +  option { +    toc: hb; +    colour: 1; +    hyphenate: 1; +    titlepage: 1; +  } + +  datefmt: "%B %Y"; + +  titlepage { +    content: " +<div align=center> +  <h1><big>C++/Tree Mapping User Manual</big></h1> +  <h1> </h1> +  <h1> </h1> +  <h1> </h1> +  <h1> </h1> +  <h1> </h1> +  <h1> </h1> +  <h1> </h1> +</div> +  <p>Revision $[revision]     $D</p> +  <p>Copyright © 2005-2014 CODE SYNTHESIS TOOLS CC</p> + +  <p>Permission is granted to copy, distribute and/or modify this +     document under the terms of the +     <a href='http://www.codesynthesis.com/licenses/fdl-1.2.txt'>GNU Free +     Documentation License, version 1.2</a>; with no Invariant Sections, +     no Front-Cover Texts and no Back-Cover Texts. +  </p> + +  <p>This document is available in the following formats: +     <a href='http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/index.xhtml'>XHTML</a>, +     <a href='http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/cxx-tree-manual.pdf'>PDF</a>, and +     <a href='http://www.codesynthesis.com/projects/xsd/documentation/cxx/tree/manual/cxx-tree-manual.ps'>PostScript</a>.</p>"; +  } + +  toc { +    indent: 2em; +  } + +  header { +    odd-right: $H; +    even-left: $H; +  } + +  footer { +    odd-left: $D; +    odd-center: $T, v$[revision]; +    odd-right: $N; + +    even-left: $N; +    even-center: $T, v$[revision]; +    even-right: $D; +  } +} + +body { +  font-size: 12pt; +  text-align: justify; +} + +pre { +  font-size: 10pt; +}  | 
