package Ġio . github . afe zer ia . fre ed ao . processor . core . template Ċ Ċ import Ġorg . w 3 c . dom . Document Ċ import Ġorg . w 3 c . dom . Element Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġorg . xml . sax . Attributes Ċ import Ġorg . xml . sax . Locator Ċ import Ġorg . xml . sax . helpers . Default Handler Ċ import Ġjava . io . InputStream Ċ import Ġjava . util .* Ċ import Ġjavax . xml . parsers . Document BuilderFactory Ċ import Ġjavax . xml . parsers . SAX Parser Ċ import Ġjavax . xml . parsers . SAX Parser Factory Ċ Ċ /** Ċ Ġ* Ġcopy Ġfrom Ġ[ link ]( https :// stackoverflow . com / a / 5 7 1 6 1 3 0 1 ) Ċ Ġ*/ Ċ object ĠPosition al XML Reader Ġ{ ĊĠĠĠ Ġconst Ġval ĠLINE _ NUMBER _ KEY _ NAME Ġ= Ġ" line Number " ĊĠĠĠ Ġconst Ġval ĠCOLUMN _ NUMBER _ KEY _ NAME Ġ= Ġ" column Number " ĊĊĠĠĠ Ġfun Ġread XML (` is `: ĠInputStream ?): ĠDocument Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc : ĠDocument ĊĠĠĠĠĠĠĠ Ġval Ġparser : ĠSAX Parser ĊĠĠĠĠĠĠĠ Ġval Ġfactory Ġ= ĠSAX Parser Factory . newInstance () ĊĠĠĠĠĠĠĠ Ġparser Ġ= Ġfactory . new SAX Parser () ĊĠĠĠĠĠĠĠ Ġval Ġdoc BuilderFactory Ġ= ĠDocument BuilderFactory . newInstance () ĊĠĠĠĠĠĠĠ Ġval Ġdoc Builder Ġ= Ġdoc BuilderFactory . new Document Builder () ĊĠĠĠĠĠĠĠ Ġdoc Ġ= Ġdoc Builder . new Document () ĊĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= ĠLine Number Handler ( doc ) ĊĠĠĠĠĠĠĠ Ġparser . parse (` is `, Ġhandler ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdoc ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠLine Number Handler ( val Ġdoc : ĠDocument ) Ġ: ĠDefault Handler () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġelement Stack : ĠStack < Element > Ġ= ĠStack < Element >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġtext Buffer Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġlocator : ĠLoc ator ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġset Document Locator ( locator : ĠLoc ator ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . locator Ġ= Ġlocator ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġstart Element ( uri : ĠString ?, Ġlocal Name : ĠString ?, Ġq Name : ĠString ?, Ġattributes : ĠAttributes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Text IfNeeded () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġel : ĠElement Ġ= Ġdoc . createElement ( q Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġattributes . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel . setAttribute ( attributes . get QName ( i ), Ġattributes . getValue ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġel . set UserData ( LINE _ NUMBER _ KEY _ NAME , Ġlocator . line Number , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġel . set UserData ( COLUMN _ NUMBER _ KEY _ NAME , Ġlocator . column Number , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Stack . push ( el ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġend Element ( uri : ĠString ?, Ġlocal Name : ĠString ?, Ġq Name : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Text IfNeeded () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclosed El : ĠElement Ġ= Ġelement Stack . pop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element Stack . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdoc . appendChild ( closed El ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparent El : ĠElement Ġ= Ġelement Stack . peek () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent El . appendChild ( closed El ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcharacters ( ch : ĠChar Array ?, Ġstart : ĠInt , Ġlength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Buffer . append ( ch , Ġstart , Ġlength ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġadd Text IfNeeded () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( text Buffer . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġel : ĠElement Ġ= Ġelement Stack . peek () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Node : ĠNode Ġ= Ġdoc . createTextNode ( text Buffer . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġel . appendChild ( text Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Buffer . delete ( 0 , Ġtext Buffer . length ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }