【发布时间】:2018-10-01 11:05:56
【问题描述】:
<?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 拆分为更小的一个。我的元素是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>
名为 2.xml 的第二个 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>
第三个名为 3.xml 的 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 选项
我尝试过的选项是参考以下链接
这是已经尝试过的示例代码。
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();
}
}
}
【问题讨论】:
标签: java xml xml-parsing xslt-2.0 stax