package Ġio . github . ir g aly . xml Ċ Ċ import Ġcom . ct c . w st x . evt . W st x Event Reader Ċ import Ġcom . ct c . w st x . st ax . W st x Input Factory Ċ import Ġio . github . ir g aly . io . Clone able InputStream Ċ import Ġorg . codehaus . st ax 2 . XML Input Factory 2 . P _ AUTO _ CLOSE _ INPUT Ċ import Ġorg . codehaus . st ax 2 . XML Input Factory 2 . P _ REPORT _ PRO LOG _ WH ITES PACE Ċ import Ġorg . codehaus . st ax 2 . evt . X MLE vent 2 Ċ import Ġjava . io . Closeable Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . InputStream Reader Ċ import Ġjavax . xml . stream . XML Input Factory .* Ċ Ċ /** Ċ Ġ* Ġpreserve Ġoriginal Ġcharacters ĠXML ĠSt AX ĠParser Ċ Ġ*/ Ċ class ĠOriginal Characters St ax Xml Parser ( ĊĠĠĠ Ġinput : ĠInputStream , ĊĠĠĠ Ġconfigure : Ġ(( factory : ĠW st x Input Factory ) Ġ-> ĠUnit )? Ġ= Ġnull Ċ ) Ġ: ĠClose able Ġ{ ĊĠĠĠ Ġprivate Ġval Ġoriginal Reader : ĠInputStreamReader ĊĠĠĠ Ġprivate Ġval Ġreader : ĠW st x Event Reader ĊĊĠĠĠ Ġprivate Ġvar Ġcurrent Event : ĠXml Event ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclone able Ġ= ĠClone able InputStream ( input ) ĊĠĠĠĠĠĠĠ Ġoriginal Reader Ġ= Ġclone able . fork (). reader () ĊĠĠĠĠĠĠĠ Ġreader Ġ= Ġ( W st x Input Factory . newInstance () Ġas ĠW st x Input Factory ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Property ( P _ AUTO _ CLOSE _ INPUT , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Property ( P _ REPORT _ PRO LOG _ WH ITES PACE , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Property ( IS _ CO AL ESC ING , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Property ( IS _ REPL ACING _ ENTITY _ REFER ENCES , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Property ( IS _ SUPPORT ING _ EXTERNAL _ ENT ITIES , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure ?. invoke ( this ) ĊĠĠĠĠĠĠĠ Ġ}. create X MLE vent Reader ( clone able ) Ġas ĠW st x Event Reader ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpeek (): ĠX MLE vent 2 ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( reader . peek () Ġas ? ĠX MLE vent 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhas Next (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . hasNext () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnext Event (): ĠXml Event Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġevent Ġ= Ġreader . next Event () Ġas ĠX MLE vent 2 ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġreader . peek () ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġif Ġ( event . is End Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Event ?. parent ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Event ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrange Ġ= Ġif Ġ( next Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . location . character Offset Ġuntil Ġnext . location . character Offset ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġempty Ġrange Ġfor ĠEnd Document ĊĠĠĠĠĠĠĠĠĠĠĠ Ġevent . location . character Offset Ġuntil Ġevent . location . character Offset ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= ĠChar Array ( range . count ()). let Ġ{ Ġbuffer Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġread Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( read Size Ġ< Ġbuffer . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġoriginal Reader . read ( buffer , Ġread Size , Ġbuffer . size Ġ- Ġread Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Size Ġ+= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString ( buffer , Ġ 0 , Ġread Size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠXml Event ( event , Ġparent , Ġrange , Ġtext ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . is Start Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Event Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( event . is End Element ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Event Ġ= Ġit . parent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġreader . close () ĊĠĠĠĠĠĠĠ Ġoriginal Reader . close () ĊĠĠĠ Ġ} Ċ } Ċ