【问题标题】:Split XML in Multiple XML files在多个 XML 文件中拆分 XML
【发布时间】:2010-01-13 13:31:30
【问题描述】:

我有以下 xml 文件作为输入 ....

<?xml version="1.0" encoding="ISO-8859-1"?>
<T0020
    xsi:schemaLocation="http://www.safersys.org/namespaces/T0020V1 T0020V1.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.safersys.org/namespaces/T0020V1">
    <INTERFACE>
        <NAME>SAFER</NAME>
        <VERSION>04.02</VERSION>
    </INTERFACE>
    <TRANSACTION>
        <VERSION>01.00</VERSION>
        <OPERATION>REPLACE</OPERATION>
        <DATE_TIME>2009-09-01T00:00:00</DATE_TIME>
        <TZ>CT</TZ>
    </TRANSACTION>
    <IRP_ACCOUNT>
        <IRP_CARRIER_ID_NUMBER>274845</IRP_CARRIER_ID_NUMBER>
        <IRP_BASE_COUNTRY>US</IRP_BASE_COUNTRY>
        <IRP_BASE_STATE>AR</IRP_BASE_STATE>
        <IRP_ACCOUNT_NUMBER>55002</IRP_ACCOUNT_NUMBER>
        <IRP_ACCOUNT_TYPE>I</IRP_ACCOUNT_TYPE>
        <IRP_STATUS_CODE>100</IRP_STATUS_CODE>
        <IRP_STATUS_DATE>2007-11-06</IRP_STATUS_DATE>
        <IRP_UPDATE_DATE>2009-08-03</IRP_UPDATE_DATE>
        <IRP_NAME>
            <NAME_TYPE>LG</NAME_TYPE>
            <NAME>A P SUPPLY CO</NAME>
            <IRP_ADDRESS>
                <ADDRESS_TYPE>PH</ADDRESS_TYPE>
                <STREET_LINE_1>1400 N OATS</STREET_LINE_1>
                <STREET_LINE_2/>
                <CITY>TEXARKANA</CITY>
                <STATE>AR</STATE>
                <ZIP_CODE>71854</ZIP_CODE>
                <COUNTY>MILLER</COUNTY>
                <COLONIA/>
                <COUNTRY>US</COUNTRY>
            </IRP_ADDRESS>
            <IRP_ADDRESS>
                <ADDRESS_TYPE>MA</ADDRESS_TYPE>
                <STREET_LINE_1>P O BOX 1927</STREET_LINE_1>
                <STREET_LINE_2/>
                <CITY>TEXARKANA</CITY>
                <STATE>AR</STATE>
                <ZIP_CODE>75504</ZIP_CODE>
                <COUNTY/>
                <COLONIA/>
                <COUNTRY>US</COUNTRY>
            </IRP_ADDRESS>
        </IRP_NAME>  
</IRP_ACCOUNT>
<IRP_ACCOUNT> ..... </IRP_ACCOUNT>
<IRP_ACCOUNT> ..... </IRP_ACCOUNT>
<IRP_ACCOUNT> ..... </IRP_ACCOUNT>
 </T0020>

我想把这个 xml 文件通过 java 代码分割成多个文件...

文件1.xml

<T0020>
 <IRP_ACCOUNT> ..... </IRP_ACCOUNT>
 <IRP_ACCOUNT> ..... </IRP_ACCOUNT>
</T0020>

文件2.xml

<T0020>
 <IRP_ACCOUNT> ..... </IRP_ACCOUNT>
 <IRP_ACCOUNT> ..... </IRP_ACCOUNT>
</T0020>

文件3.xml

<T0020>
 <IRP_ACCOUNT> ..... </IRP_ACCOUNT>
 <IRP_ACCOUNT> ..... </IRP_ACCOUNT>
</T0020>

还有更多的 xml 文件。每个 xml 文件最多包含 10 或 15 个 IRP_ACCOUNT。

有人可以帮帮我吗?

【问题讨论】:

  • 你应该明确地使用 usr xpath 和 vtd-xml 来完成这个任务。

标签: java xml


【解决方案1】:

又快又脏:

public class XmlSplit {

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

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

        int itemsPerFile = 5;
        int fileNumber = 0;
        Document currentDoc = dbf.newDocumentBuilder().newDocument();
        Node rootNode = currentDoc.createElement("T0020");
        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("T0020");
                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)));
    }
}

【讨论】:

  • Kevin,感谢您的帮助。我需要尽快应用并更新您。
  • 嗨 Kevin,当我给定大小为 17 MB 的 xml 文件时,它会在 newDocumentBuilder().parse() 方法中出现 java 堆空间不足的异常。我应该怎么做才能避免它??
  • 谢谢凯文,谢谢你的帮助。我的问题现在已经解决了。
  • 你的@Kevin,希望你能看到这条评论。我有一个类似但复杂的问题,而且我是 XML 解析的新手。我有一个像这样的复杂 XML 结构:...。我必须将此 xml 拆分为一个 xml 文件 foreach 但我有维护上层节点(也包括它们的属性)。我该怎么办?
猜你喜欢
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多