Java 根据标记值的变化将xml拆分为较小的xml
第二个名为2.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>
<?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);