groovy - Split an XML file into multiple files -


suppose have following xml file:

<a>   <b>    ....   </b>   <b>    ....   </b>   <b>    ....   </b> </a> 

i want split file multiple xml files based on number of <b> tags.

like:

file01.xml

<a>   <b>    ....   </b> </a> 

file02.xml

<a>   <b>    ....   </b> </a> 

file03.xml

<a>   <b>    ....   </b> </a> 

and on...

i'm new groovy , tried following piece of code.

import java.util.hashmap import java.util.list import javax.xml.parsers.documentbuilderfactory import org.custommonkey.xmlunit.* import org.w3c.dom.nodelist import javax.xml.xpath.* import javax.xml.transform.transformerfactory import org.w3c.dom.* import javax.xml.transform.dom.domsource import javax.xml.transform.stream.streamresult  class file_split {             file input = new file("c:\\file\\input.xml")         def dbf  = documentbuilderfactory.newinstance().newdocumentbuilder()         def doc = new xmlslurper(dbf).parse(classloader.getsystemresourceasstream(input));         def xpath = xpathfactory.newinstance().newxpath()          nodelist nodes = (nodelist) xpath.evaluate("//a/b", doc, xpathconstants.nodeset)          def itemsperfile = 5;         def filenumber = 0;          def currentdoc = dbf.newdocument()         def rootnode = currentdoc.createelement("a")         def currentfile = new file(filenumber + ".xml")          try{             for(i = 1; <= nodes.getlength(); i++){                 def imported = currentdoc.importnode(nodes.item(i-1), true)                 rootnode.appendchild(imported)                  if(i % itemsperfile == 0){                     writetofile(rootnode, currentfile)                      rootnode = currentdoc.createelement("a");                     currentfile = new file((++filenumber)+".xml");                 }             }         }         catch(exception ex){             logerror(file.name,ex.getmessage());             ex.printstacktrace();         }      def writetofile(node node, file file) throws exception {         def transformer = transformerfactory.newinstance().newtransformer();         transformer.transform(new domsource(node), new streamresult(new filewriter(file)));     } } 

any appreciated.

this should work:

import groovy.xml.*  new xmlslurper().parsetext( file ).b.eachwithindex { element, index ->     new file( "/tmp/file${ "${index+1}".padleft( 2, '0' ) }.xml" ).withwriter { w ->         w << xmlutil.serialize( new streamingmarkupbuilder().bind {             {                  mkp.yield element             }         } )     } } 

if want group them, can use collate (this example groups 2 b tags per file:

import groovy.xml.*  new xmlslurper().parsetext( file )                 .b                 .tolist()                 .collate( 2 )                 .eachwithindex { elements, index ->     new file( "/tmp/file${ "${index+1}".padleft( 2, '0' ) }.txt" ).withwriter { w ->         w << xmlutil.serialize( new streamingmarkupbuilder().bind {             {                 elements.each { element ->                     mkp.yield element                 }             }         } )     } } 

Comments

Popular posts from this blog

database - VFP Grid + SQL server 2008 - grid not showing correctly -

jquery - Set jPicker field to empty value -

.htaccess - htaccess convert request to clean url and add slash at the end of the url -