gpt4 book ai didi

java - 根据标签值的变化将 xml 拆分为更小的 XML

转载 作者:行者123 更新时间:2023-12-02 01:53:49 24 4
gpt4 key购买 nike

<?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>
<row>
<id>222</id>
<name>def</name>
<deptId>2</deptId>
</row>
<row>
<id>333</id>
<name>pqr</name>
<deptId>2</deptId>
</row>
<row>
<id>444</id>
<name>xyz</name>
<deptId>2</deptId>
</row>
<row>
<id>555</id>
<name>lmn</name>
<deptId>3</deptId>
</row>
<row>
<id>555</id>
<name>lmn</name>
<deptId>3</deptId>
</row>
</START>
</Tables>
</ABC>

我有一个具有上述结构的 xml。我必须根据不同的 deptId 将 xml 分成 3 个 xml。我必须根据标签值的变化将 xml 拆分为更小的 XML。我的元素是 deptId ,其值在某些行后发生了更改。所有具有相同 deptId 的元素都在一个序列中。

所需的输出是:最好将 xml 名称作为部门 ID。

第一个 xml 的名称为 1.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 名称为 2.xml:

<?xml version="1.0" encoding="UTF-16"?>
<ABC>
<END />
<Tables>
<START>
<row>
<id>222</id>
<name>def</name>
<deptId>2</deptId>
</row>
<row>
<id>333</id>
<name>pqr</name>
<deptId>2</deptId>
</row>
<row>
<id>444</id>
<name>xyz</name>
<deptId>2</deptId>
</row>
</START>
</Tables>
</ABC>

第三个 xml 名称为 3.xml:

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

我通过引用几个选项尝试使用 StAXSource 选项我尝试过的选项是引用下面的链接

Split xml Split large 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();
}
}

}

最佳答案

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

<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>

要从 Java 应用程序运行此程序,您需要下载 Saxon,然后使用以下逻辑调用它:

    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);

更多详细信息请参见:http://www.saxonica.com/documentation/index.html#!using-xsl/embedding/s9api-transformation

关于java - 根据标签值的变化将 xml 拆分为更小的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52589777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com