2015-10-08 21 views
1
{ 

public class XmlSplit { 

public static void main(String [] args) throws Exception { 
File input = new File("C:\\Users\\Edit5.xml"); 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
Document doc = (Document) dbf.newDocumentBuilder().parse(input); 
XPath xpath = XPathFactory.newInstance().newXPath(); 
NodeList nodes = (NodeList) xpath.evaluate("//transaction", doc, XPathConstants.NODESET); 
int itemsPerFile = 2000; 
int fileNumber = 0; 
Document currentDoc = (Document) dbf.newDocumentBuilder().newDocument(); 
Node rootNode; 


rootNode = currentDoc.createElement("transactions"); 
File currentFile = new File(fileNumber+".xml"); 
for (int i=1; i <= nodes.getLength(); i++) { 
    Node imported = currentDoc.importNode(nodes.item(i-1), true); 
    rootNode.appendChild(imported); 

    if (i % itemsPerFile == 0) { 
     writeToFile(rootNode, currentFile); 
     rootNode = currentDoc.createElement("transactions"); 
     currentFile = new File((++fileNumber)+"C:\\UsersEdit1.xml"); 
    } 
    else 
    { 
      writeToFile(rootNode, currentFile); 
    } 
} 

} 

private static void writeToFile(Node node, File file) throws Exception { 
Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.transform(new DOMSource(node), new StreamResult(new FileWriter("C:\\UsersEdit1.xml"))); 
} 
} 


} 

嗨,我使用DOM解析器分裂的大XML但它需要长时间来分割XML。可有人能帮我解决这个使用stax解析器来做到这一点。它也不会产生新的文件。这也是一个问题。在预先如果有人可以做到这一点,请帮助我。大型XML分裂,但我想用STAX解析器所以业绩增长

+0

如何大是大? 50Kb或50Gb?慢多慢?给我们一些数字将帮助我们评估是否废除你现有的方法并尝试不同的方法是明智的做法。 –

+0

文件大小为150 MB,它发出的内存堆错误。如果我们通过像50 MB的小尺寸XML,它需要超过半小时才能完成。 –

+0

我不明白为什么它需要这么长时间:这里可能存在一些与您向我们显示的代码无关的问题。您是否尝试过使用Java CPU配置文件来查明时间到了哪里? –

回答

0

这里是分裂的vtd-xml你的XML代码...

import com.ximpleware.*; 
import java.io.*; 

public class splitter { 
    public static void main(String[] s) throws VTDException, IOException { 
     VTDGen vg = new VTDGen(); 
     if (!vg.parseFile("input.xml", false)) 
      return; 
     VTDNav vn = vg.getNav(); 
     AutoPilot ap = new AutoPilot(vn); 
     ap.selectXPath("//transaction"); 
     int i=0,j=0,k=0; 
     File f = new File("transactionList"+k+".xml"); 
     FileOutputStream fos = new FileOutputStream(f); 
     byte[] head="<transactions>\n".getBytes(); 
     byte[] tail="\n</transactions>".getBytes(); 
     fos.write(head); 
     while((i=ap.evalXPath())!=-1){ 
      long l=vn.getElementFragment(); 
      fos.write(vn.getXML().getBytes(), (int)l, (int)(l>>32)); 
      j++; 
      if ((j+1)%2000==0){ 
       k++; 
       fos.write(tail); 
       fos.close(); 
       f = new File("transactionList"+k+".xml"); 
       fos = new FileOutputStream(f); 
       fos.write(head); 
      } 
     } 
     fos.write(tail); 
     fos.close(); 
    } 
}