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
Post a Comment