Groovy 将XML文件拆分为多个文件

Groovy 将XML文件拆分为多个文件,groovy,Groovy,假设我有以下XML文件: <a> <b> .... </b> <b> .... </b> <b> .... </b> </a> .... .... .... 我希望根据标记的数量将此文件拆分为多个XML文件 比如: File01.xml <a> <b> .... </b> </a> <

假设我有以下XML文件:

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

....
....
....
我希望根据
标记的数量将此文件拆分为多个XML文件

比如:

File01.xml

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

....
File02.xml

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

....
File03.xml

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

....
等等

我是Groovy新手,我尝试了以下代码

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; i <= 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)));
    }
}
import java.util.HashMap
导入java.util.List
导入javax.xml.parsers.DocumentBuilderFactory
导入org.custommonkey.xmlunit*
导入org.w3c.dom.NodeList
导入javax.xml.xpath*
导入javax.xml.transform.TransformerFactory
导入org.w3c.dom*
导入javax.xml.transform.dom.DOMSource
导入javax.xml.transform.stream.StreamResult
类文件_split{
文件输入=新文件(“C:\\File\\input.xml”)
def dbf=DocumentBuilderFactory.newInstance().newDocumentBuilder()
def doc=newxmlslurper(dbf).parse(ClassLoader.getsystemresourceastream(input));
def xpath=XPathFactory.newInstance().newXPath()
NodeList节点=(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=新文件(文件号+“.xml”)
试一试{

对于(i=1;i我不知道您遇到了什么问题,但似乎您在需要时创建了一个新的
rootNode
,而不是一个新的
currentdoc
。在重新初始化循环中的
rootNode
之前,请尝试重新初始化
currentdoc

我不知道您遇到了什么问题,但是似乎是在需要时创建了一个新的
rootNode
,而不是一个新的
currentdoc
。在重新初始化循环中的
rootNode
之前,尝试重新初始化
currentdoc

我不知道您遇到了什么问题,但似乎是在需要时创建了一个新的
rootNode
ed,但不是新的
currentdoc
。在重新初始化循环中的
rootNode
之前,请尝试重新初始化
currentdoc

我不知道您遇到了什么问题,但似乎您需要时创建了一个新的
rootNode
,而不是一个新的
currentdoc
。尝试重新初始化在您重新初始化循环中的
rootNode
之前,请执行以下操作:

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 {
            a { 
                mkp.yield element
            }
        } )
    }
}
这应该起作用:

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 {
            a { 
                mkp.yield element
            }
        } )
    }
}
这应该起作用:

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 {
            a { 
                mkp.yield element
            }
        } )
    }
}
这应该起作用:

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 {
            a { 
                mkp.yield element
            }
        } )
    }
}


+1,但从他的代码来看,似乎他希望每个文件有5个条目。啊……我没有注意到这一点,于是离开了问题中的(可能很差)示例;-)@RobbyCornelissen更新了答案:-)几乎需要5而不是2:-D@RobbyCornelissen呵呵,我的测试xml中没有足够的元素来测试5;-)+1,但从他的代码来看,似乎他希望每个文件有5个条目。啊……我错过了,然后退出了(可能很差)问题中的示例;-)@RobbyCornelissen更新了答案:-)几乎需要5而不是2:-D@RobbyCornelissen呵呵,我的测试xml中没有足够的元素来测试5;-)+1,但从他的代码来看,似乎他希望每个文件有5个条目。啊……我错过了,然后退出了(可能很差)问题中的示例;-)@RobbyCornelissen更新了答案:-)几乎需要5而不是2:-D@RobbyCornelissen呵呵,我的测试xml中没有足够的元素来测试5;-)+1,但从他的代码来看,似乎他希望每个文件有5个条目。啊……我错过了,然后退出了(可能很差)问题中的示例;-)@RobbyCornelissen更新了答案:-)几乎需要5而不是2:-D@RobbyCornelissen呵呵,我的测试xml中没有足够的元素来测试5;-)