2014-02-28 130 views
0

我需要根據標籤的開始和結束將我的xml分割爲多個xml。對於這個我試着用下面的代碼使用java分割xml基於xml標籤的多個xmls

public class XmlSplit { 

    public static void main(String [] args) throws Exception { 
    File input = new File("/home/dev702/Desktop/cadgraf-test/Data_Entry.xml"); 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    Document doc = (Document) dbf.newDocumentBuilder().parse(input); 
    XPath xpath = XPathFactory.newInstance().newXPath(); 

    NodeList nodes = (NodeList) xpath.evaluate("//Data_x0020_Entry", doc, XPathConstants.NODESET); 

    int itemsPerFile = 500; 
    int fileNumber = 0; 
    Document currentDoc = (Document) dbf.newDocumentBuilder().newDocument(); 
    Node rootNode; 
    rootNode = currentDoc.createElement("Data_x0020_Entry"); 
    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("Data_x0020_Entry"); 
      currentFile = new File((++fileNumber)+".xml"); 
     } 
    } 

    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(file))); 
} 
} 

在這裏我得到currentDoc.createElement錯誤。我無法編譯這段代碼,它說createElement不可用。

示例XML文件

<?xml version="1.0" encoding="UTF-8"?> 
<dataroot 
    xmlns:od="urn:schemas-microsoft-com:officedata" 
    xmlns:xsi="w3.org/2001/XMLSchema-instance" ; 
    xsi:noNamespaceSchemaLocation="Data%20Entry.xsd" 
    generated="2014-02-12T14:35:47" 
> 
    <Data_x0020_Entry> 
     <ID>1004</ID> 
     <User>006Parthiban</User> 
     <Data_x0020_Entry_x0020_Date>2013-12-26T00:00:00</Data_x0020_Entry_x0020_Date> 
     <Publication>Daily Thanthi</Publication> 
     <Edition>CE City Edition</Edition> 
     <Location>Bangalore</Location> 
    </Data_x0020_Entry> 
</dataroot> 
+0

u能張貼示例XML文件that..what錯誤你得到的堆棧跟蹤請...並更改節點根節點;到元素根節點,並嘗試 – Naren

+0

我在自己的示值誤差使用NetBeans上徘徊這顯示「無法找到方法‘的createElement(字符串)’。因此,我將無法運行該文件 – user3354849

+0

是dataroot仍然在你的劈裂xml文件? –

回答

1

我看不出在這個代碼編譯的任何問題。請檢查您的導入聲明並確認您已導入適當的課程。我進口類列表是如下

import java.io.File; 
import java.io.FileWriter; 

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
1

我覺得你有進口import javax.swing.text.Document;變化,爲import org.w3c.dom.Document;

而且如果烏拉圭回合使用的Swing太不是使用完全合格,對於創建文檔

org.w3c.dom.Document currentDoc = (org.w3c.dom.Document) dbf.newDocumentBuilder().newDocument(); 

更新

我認爲根元素應該是對於分割xml的「dataroot」。你需要改變你的代碼來生成正確數量的xml文件(看下面的代碼)..看看下面的代碼..我測試了
int itemsPerFile = 2; ..它工作正常..

注意刪除「;」從namespcae後輸入XML文件

import java.io.File; 
import java.io.FileWriter; 

import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 
import javax.xml.xpath.XPath; 
import javax.xml.xpath.XPathConstants; 
import javax.xml.xpath.XPathFactory; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

    public class XmlSplit { 

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


    rootNode = currentDoc.createElement("dataroot"); 
    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("dataroot"); 
      currentFile = new File((++fileNumber)+".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(file))); 
} 
} 

讓我知道如果u面對任何問題:)

+0

導入命令是問題,但是當我運行它不會返回anything..its返回爲空 – user3354849

+0

使烏拉圭回合後樣品輸入XML文件,所以我們可以測試問題所在 – Naren

+0

我的示例XML: 006Parthiban 2013-12-26T00:00:00 日報Thanthi CE城市版 班加羅爾 user3354849