package Ġwell usion Ċ Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . w 3 c . dom . Attr Ċ import Ġorg . w 3 c . dom . Element Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġorg . w 3 c . dom . NodeList Ċ import Ġjava . io . File Ċ import Ġjavax . xml . transform . stream . Stream Result Ċ import Ġjavax . xml . validation . Schema Ċ import Ġjavax . xml . xpath . XPath Constants Ċ import Ġjavax . xml . xpath . XPath Factory Ċ Ċ val ĠElement . ext : ĠElement Ext ĊĠĠĠ Ġget () Ġ= Ġobject Ġ: ĠElement Ext () Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLoggerFactory . getLogger ( this :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Child Element ( name : ĠString ): ĠElement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Child Element If Exist ( name ) !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Child Element If Exist ( name : ĠString ): ĠElement ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement List Ġ= ĠgetAll Child Elements () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsearched Element Ġ= Ġelement List . find Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSearch Ġin Ġan Ġelement Ġis Ġperformed Ġwith Ġa Ġprefix Ġof Ġa Ġnamespace . ĠRemove Ġit Ġbecause Ġit Ġchanges . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ find Ġ( name Ġ== Ġelement . tagName . substring After (" :" )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sear ched Element Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" An Ġelement Ġby Ġname Ġ\"$ name \" Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsearched Element ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetAll Child Elements ( name : ĠString ): ĠList < Element > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠgetAll Elements By Xpath ("* [ local - name () ='$ name '] ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetAll Child Elements (): ĠList < Element > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( has Child Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild Nodes . ext . to Element List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" The Ġelement Ġ\" ${ tagName }\" Ġhasn 't Ġchild Ġelements .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠsetValue ( value : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Content Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetValue (): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( has Child Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" The Ġelement Ġ\" ${ tagName }\" Ġhas Ġchild Ġelements .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Content ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Child Elements (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchild Nodes . ext . to Element List (). isNotEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Element By Xpath ( s Xpath : ĠString ): ĠElement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Element By Xpath If Exist ( s Xpath ) !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Element By Xpath If Exist ( s Xpath : ĠString ): ĠElement ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelements Ġ= ĠgetAll Elements By Xpath ( s Xpath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( elements . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elements . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" Found Ġmore Ġthan Ġone Ġelement . ĠThe Ġfirst Ġone Ġwill Ġbe Ġreturned .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelements [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetAll Elements By Xpath ( s Xpath : ĠString ): ĠList < Element > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxpath Ġ= ĠXPath . x Path Factory . new XPath () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Path Expression Ġ= Ġxpath . compile ( s Xpath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode List Ġ= Ġx Path Expression . evaluate ( this @ ext , ĠXPath Constants . NODE SET ) Ġas ĠNode List ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement List Ġ= Ġnode List . ext . to Element List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( element List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" Xml Ġelements Ġby Ġx Path : Ġ$ s Xpath Ġnot Ġfound .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelement List ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhas Elements By Xpath ( s Xpath : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelements Ġ= ĠgetAll Elements By Xpath ( s Xpath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġelements . isNotEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Child Element ( name : ĠString , Ġvalue : ĠString ?, Ġnamespace : ĠString ?): ĠElement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġif Ġ( namespace Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Document . createElement ( name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Document . createElement NS ( namespace , Ġname ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . textContent Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġappend Child ( element ) Ġas ĠElement ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Child Element With Disabled Esc aping ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname : ĠString , Ġescaped Symbol : ĠString , Ġvalue : ĠString ?, Ġnamespace : ĠString ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdisable Esc aping Ġ= Ġowner Document . create Processing Instruction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Result . PI _ DISABLE _ OUTPUT _ ES CAP ING , Ġescaped Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Child ( disable Esc aping ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Child Element ( name , Ġvalue , Ġnamespace ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenable Esc aping Ġ= Ġowner Document . create Processing Instruction ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStream Result . PI _ ENABLE _ OUTPUT _ ES CAP ING , Ġescaped Symbol ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Child ( enable Esc aping ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd Clone Child Element ( element : ĠElement ): ĠElement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclone Element Ġ= Ġowner Document . import Node ( element , Ġtrue ) Ġas ĠElement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġappend Child ( clone Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclone Element ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Child Element By Attr ( name : ĠString , Ġvalue : ĠString ): ĠElement Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Child Element By Attr If Exist ( name , Ġvalue ) !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Child Element By Attr If Exist ( name : ĠString , Ġvalue : ĠString ): ĠElement ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Elements Ġ= ĠgetAll Child Elements By Attr ( name , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found Elements . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" The Ġelement Ġ\" ${ tagName }\" Ġhasn 't Ġchild Ġelement Ġwith Ġthe Ġattribute Ġ\"$ name \" =\" $ value \" .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( found Elements . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" The Ġelement Ġ\" ${ tagName }\" Ġhas Ġmore Ġthan Ġone Ġchild Ġelement Ġwith Ġthe Ġattribute Ġ\"$ name \" =\" $ value \" .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfound Elements [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetAll Child Elements By Attr ( name : ĠString , Ġvalue : ĠString ): ĠList < Element > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! has Child Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" The Ġelement Ġ\" ${ tagName }\" Ġhasn 't Ġchild Ġelements .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchild Nodes . ext . to Element List (). filter Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . ext . get Attr Value ( name )?. equals ( value ) Ġ?: Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠgetAll Child Elements By Exist Attr ( attr Name : ĠString ): ĠList < Element > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠgetAll Elements By Xpath ("* [@ $ attr Name ]") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Attr ( attr Name : ĠString ): ĠAttr ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattrs Ġ= Ġattributes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attrs Ġ== Ġnull Ġ|| Ġattrs . length Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" Element Ġby Ġname Ġ\" ${ nodeName }\" Ġhasn 't Ġattributes .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġattr : ĠAttr ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġattrs . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attrs . item ( i ). local Name Ġ== Ġattr Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattr Ġ= Ġattrs . item ( i ) Ġas ? ĠAttr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( attr Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" Attribute Ġby Ġname : Ġ\"$ attr Name \" Ġnot Ġfound Ġin Ġthe Ġelement Ġ\" ${ nodeName }\" ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġattr ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Attr Value ( attr Name : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġattr Ġ= Ġget Attr ( attr Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġattr ?. textContent ?. trim () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġelement By pass ( consumer : Ġ( Element ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Elements Ġ= Ġchild Nodes . ext . to Element List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchild Elements . forEach Ġ{ Ġelement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement . ext . element By pass ( consumer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconsumer ( this @ ext ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġremove Child Element ( element Name : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġremoving Element Ġ= Ġget Child Element If Exist ( element Name ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremove Child ( re moving Element ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . info (" The Ġelement Ġ\"$ element Name \" Ġis Ġremoved .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnode Ext Ġ= Ġ( this @ ext Ġas ĠNode ). ext ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġto File ( file : ĠFile ) Ġ= Ġnode Ext . to File ( file ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġto InputStream () Ġ= Ġnode Ext . to InputStream () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġto ByteArray () Ġ= Ġnode Ext . toByteArray () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġnode Ext . toString () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġschema Validation ( schema : ĠSchema , Ġthrew Exception : ĠBoolean ) Ġ= Ġnode Ext . schema Validation ( schema , Ġthrew Exception ) ĊĠĠĠ Ġ} Ċ Ċ private Ġobject ĠXPath Ġ{ ĊĠĠĠ Ġval Ġx Path Factory : ĠXPath Factory Ġ= ĠXPath Factory . newInstance () Ċ }