Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据标记值的变化将xml拆分为较小的xml_Java_Xml_Xml Parsing_Xslt 2.0_Stax - Fatal编程技术网

Java 根据标记值的变化将xml拆分为较小的xml

Java 根据标记值的变化将xml拆分为较小的xml,java,xml,xml-parsing,xslt-2.0,stax,Java,Xml,Xml Parsing,Xslt 2.0,Stax,第二个名为2.xml的xml: <?xml version="1.0" encoding="UTF-16"?> <ABC> <END /> <Tables> <START> <row> <id>111</id> <name>abc</name>

第二个名为2.xml的xml:

<?xml version="1.0" encoding="UTF-16"?>
<ABC>
    <END />
    <Tables>
        <START>
            <row>
                <id>111</id>
                <name>abc</name>
                <deptId>1</deptId>
            </row>
            <row>
                <id>112</id>
                <name>abc1</name>
                <deptId>1</deptId>
            </row>
            <row>
                <id>113</id>
                <name>abc3</name>
                <deptId>1</deptId>
            </row>
        </START>
    </Tables>
</ABC>

}

XML读取应按
进行,大致如下所示:

import java.io.File;
import java.io.FileReader;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;

public class Demo2 {

public static void main(String[] args) throws Exception {
    XMLInputFactory xif = XMLInputFactory.newInstance();
    XMLStreamReader streamReader = xif.createXMLStreamReader(new FileReader("D://SmallXmltoSplit.xml"));

    streamReader.nextTag(); // Advance to next element
    streamReader.nextTag();
    streamReader.nextTag();
    streamReader.nextTag();
    streamReader.nextTag();
    streamReader.nextTag();

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer t = tf.newTransformer();
    String deptId = null;
    File file = new File("D://test" + ".xml");
    while (streamReader.hasNext()) {
        if (streamReader.isStartElement()) {
            if (streamReader.getLocalName().equals("deptId")) {
                if (deptId == null) {
                    deptId = streamReader.getElementText();
                    file = new File("D://" + deptId + ".xml");
                    t.transform(new StAXSource(streamReader), new StreamResult(file));
                } else if (deptId != streamReader.getElementText()) {
                    file = new File("D://" + deptId + ".xml");
                    t.transform(new StAXSource(streamReader), new StreamResult(file));
                } 
            }
            t.transform(new StAXSource(streamReader), new StreamResult(file));
        }
        streamReader.next();
    }
}
//File File=新文件(“D:/test“+”.xml”)

写作无需变换;事实上,它可以作为文本来完成

我把它当作一种锻炼

不应使用FileReader和FileWriter,因为它们使用默认平台编码对字节进行编码。类
Files
有许多很好的文件函数


这里的另一个特色是UTF-16编码,它将几乎ASCII文件的大小增加了一倍。正如您提到的有一个大文件,最好将该文件保存在UTF-8中,即使名称是波斯语、希腊语、日语或保加利亚语。

XML读取应按
进行,大致如下所示:

import java.io.File;
import java.io.FileReader;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;

public class Demo2 {

public static void main(String[] args) throws Exception {
    XMLInputFactory xif = XMLInputFactory.newInstance();
    XMLStreamReader streamReader = xif.createXMLStreamReader(new FileReader("D://SmallXmltoSplit.xml"));

    streamReader.nextTag(); // Advance to next element
    streamReader.nextTag();
    streamReader.nextTag();
    streamReader.nextTag();
    streamReader.nextTag();
    streamReader.nextTag();

    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer t = tf.newTransformer();
    String deptId = null;
    File file = new File("D://test" + ".xml");
    while (streamReader.hasNext()) {
        if (streamReader.isStartElement()) {
            if (streamReader.getLocalName().equals("deptId")) {
                if (deptId == null) {
                    deptId = streamReader.getElementText();
                    file = new File("D://" + deptId + ".xml");
                    t.transform(new StAXSource(streamReader), new StreamResult(file));
                } else if (deptId != streamReader.getElementText()) {
                    file = new File("D://" + deptId + ".xml");
                    t.transform(new StAXSource(streamReader), new StreamResult(file));
                } 
            }
            t.transform(new StAXSource(streamReader), new StreamResult(file));
        }
        streamReader.next();
    }
}
//File File=新文件(“D:/test“+”.xml”)

写作无需变换;事实上,它可以作为文本来完成

我把它当作一种锻炼

不应使用FileReader和FileWriter,因为它们使用默认平台编码对字节进行编码。类
Files
有许多很好的文件函数


这里的另一个特色是UTF-16编码,它将几乎ASCII文件的大小增加了一倍。正如您提到的有一个大文件,最好将该文件保存在UTF-8中,即使名称是波斯语、希腊语、日语或保加利亚语。

使用XSLT 2.0更容易做到这一点:

    while (streamReader.hasNext()) {
        if (streamReader.isStartElement()) {
            switch (streamReader.getLocalName()) {
            case "row":
                id = "";
                name = "";
                deptId = "";
                break;
            case "id":
                id = streamReader.getElementText();
                break;
            case "name":
                name = streamReader.getElementText();
                break;
            case "deptId":
                deptId = streamReader.getElementText();
                break;
            }
        }
        if (streamReader.isEndElement()) {
            switch (streamReader.getLocalName()) {
            case "START":
                if (oldDeptId != null) {
                    saveDept();
                    //oldDeptId = deptId;
                }
                break;
            case "row":
                if (!deptId.equals(oldDeptId)) {
                    if (oldDeptId != null) {
                        saveDept();
                        oldDeptId = deptId;
                    }
                    startDept(deptId);
                }
                appendDeptRow(id, name, deptId);
                break;
            }
        }
    }

这里有更多详细信息:

使用XSLT 2.0更容易做到这一点:

    while (streamReader.hasNext()) {
        if (streamReader.isStartElement()) {
            switch (streamReader.getLocalName()) {
            case "row":
                id = "";
                name = "";
                deptId = "";
                break;
            case "id":
                id = streamReader.getElementText();
                break;
            case "name":
                name = streamReader.getElementText();
                break;
            case "deptId":
                deptId = streamReader.getElementText();
                break;
            }
        }
        if (streamReader.isEndElement()) {
            switch (streamReader.getLocalName()) {
            case "START":
                if (oldDeptId != null) {
                    saveDept();
                    //oldDeptId = deptId;
                }
                break;
            case "row":
                if (!deptId.equals(oldDeptId)) {
                    if (oldDeptId != null) {
                        saveDept();
                        oldDeptId = deptId;
                    }
                    startDept(deptId);
                }
                appendDeptRow(id, name, deptId);
                break;
            }
        }
    }

此处的更多详细信息:

您能指导我如何执行相同的操作吗?我已添加到我的答案中。您能指导我如何执行相同的操作吗?我已添加到我的答案中。
    XMLInputFactory xif = XMLInputFactory.newInstance();
    // Do not use a Reader, especially not a FileReader. An InputStream leaves the
    // encoding of the XML to the XMLStreamReader.
    InputStream in = Files.newInputStream(Paths.get("D:/SmallXmltoSplit.xml"));
    XMLStreamReader streamReader = xif.createXMLStreamReader(in);
    streamReader.nextTag();

    String id = "";
    String name = "";
    String deptId = "";

    String oldDeptId = null;
    while (streamReader.hasNext()) {
        if (streamReader.isStartElement()) {
            switch (streamReader.getLocalName()) {
            case "row":
                id = "";
                name = "";
                deptId = "";
                break;
            case "id":
                id = streamReader.getElementText();
                break;
            case "name":
                name = streamReader.getElementText();
                break;
            case "deptId":
                deptId = streamReader.getElementText();
                break;
            }
        }
        if (streamReader.isEndElement()) {
            switch (streamReader.getLocalName()) {
            case "START":
                if (oldDeptId != null) {
                    saveDept();
                    //oldDeptId = deptId;
                }
                break;
            case "row":
                if (!deptId.equals(oldDeptId)) {
                    if (oldDeptId != null) {
                        saveDept();
                        oldDeptId = deptId;
                    }
                    startDept(deptId);
                }
                appendDeptRow(id, name, deptId);
                break;
            }
        }
    }
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform version="2.0">
  <xsl:template match="/">
    <xsl:for-each-group select="//row" group-adjacent="deptId">
      <xsl:result-document href="{current-grouping-key()}.xml">
        <ABC>
         <END />
          <Tables>
           <START>
            <xsl:copy-of select="current-group()"/>
           </START>
          </Tables>
        </ABC>
      </xsl:result-document>
    </xsl:for-each-group>
  </xsl:template>
</xsl:transform>
    Processor proc = new Processor(false);
    XsltCompiler comp = proc.newXsltCompiler();
    XsltExecutable exp = comp.compile(new StreamSource(new File("my-stylesheet.xsl")));
    Serializer out = proc.newSerializer(new File("output.xml"));
    Xslt30Transformer trans = exp.load30();
    trans.applyTemplates(new StreamSource(new File("input.xml"), out);