가정하자 I 후속 XML 파일이 있습니다분할 여러 파일에 XML 파일
<a>
<b>
....
</b>
<b>
....
</b>
<b>
....
</b>
</a>
내가 <b>
태그의 수에 따라 여러 XML 파일로이 파일을 분할하고자합니다.
처럼 :
File01.xml
<a>
<b>
....
</b>
</a>
File02.xml
<a>
<b>
....
</b>
</a>
File03.xml
<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)));
}
}
도움을 주시면 감사하겠습니다.
+1,하지만 자신의 코드에서, 그래도 그가 파일 당 5 개의 항목을 갖고 싶어하는 것 같아. –
Ahhhh ... 내가 그것을 놓쳤다. 그리고 질문에 (잠재적으로 가난한) 예를 들어갔다 ;-) –
@RobbyCornelissen 업데이트 된 답변 :-) –