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