2014-06-10 2 views
0

가정하자 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))); 
    } 
} 

도움을 주시면 감사하겠습니다.

답변

3

이 작동합니다

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

+1,하지만 자신의 코드에서, 그래도 그가 파일 당 5 개의 항목을 갖고 싶어하는 것 같아. –

+0

Ahhhh ... 내가 그것을 놓쳤다. 그리고 질문에 (잠재적으로 가난한) 예를 들어갔다 ;-) –

+0

@RobbyCornelissen 업데이트 된 답변 :-) –

0

어떤 문제가 발생했는지 알 수는 없지만 필요한 경우 새로운 rootNode을 만드는 것처럼 보이지만 새로운 currentdoc은 아닌 것 같습니다. 루프에 rootNode을 다시 초기화하기 바로 전에 currentdoc을 다시 초기화하십시오. 당신이 그룹화하려는 경우 (한 부씩 인쇄를 사용하여이 예를 들어 그룹 파일 당 2 개 b 태그 수,

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 
      } 
     }) 
    } 
} 

을 :