使用java将xml基于xml标记拆分为多个xmls

时间:2014-02-28 05:36:52

标签: java xml swing

我需要根据标签start和close将我的xml分成多个xml。为此,我尝试使用以下代码

    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>

2 个答案:

答案 0 :(得分:1)

我在这段代码中看不到任何编译问题。请检查您的import语句并验证您是否已导入正确的类。我导入的类列表如下所示

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 :(得分:1)

我认为您已导入import javax.swing.text.Document;将其更改为import org.w3c.dom.Document;

如果你使用Swing而不是使用完全限定的来创建Document

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

<强>更新

我认为对于分割的xmls,根元素应该是“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)));
}
}

让我知道你是否面临任何问题:)