【发布时间】:2011-06-24 10:27:31
【问题描述】:
我有一个 200 MB 的 xml,格式如下:
<school name = "some school">
<class standard = "2A">
<student>
.....
</student>
<student>
.....
</student>
<student>
.....
</student>
</class>
</school>
我需要将此 xml 拆分为多个文件,使用 StAX 这样每个 xml 文件下有 n 个学生,结构保留为 <school> 然后 <class>和<students> 在他们下面。 School 和 class 的属性也必须保留在生成的 xml 中。
这是我正在使用的代码:
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
String xmlFile = "input.XML";
XMLEventReader reader = inputFactory.createXMLEventReader(new FileReader(xmlFile));
XMLOutputFactory outputFactory = XMLOutputFactory.newInstance();
outputFactory.setProperty("javax.xml.stream.isRepairingNamespaces", Boolean.TRUE);
XMLEventWriter writer = null;
int count = 0;
QName name = new QName(null, "student");
try {
while (true) {
XMLEvent event = reader.nextEvent();
if (event.isStartElement()) {
StartElement element = event.asStartElement();
if (element.getName().equals(name)) {
String filename = "input"+ count + ".xml";
writer = outputFactory.createXMLEventWriter(new FileWriter(filename));
writeToFile(reader, event, writer);
writer.close();
count++;
}
}
if (event.isEndDocument())
break;
}
} catch (XMLStreamException e) {
throw e;
} catch (IOException e) {
e.printStackTrace();
} finally {
reader.close();
}
private static void writeToFile(XMLEventReader reader, XMLEvent startEvent, XMLEventWriter writer) throws XMLStreamException, IOException {
StartElement element = startEvent.asStartElement();
QName name = element.getName();
int stack = 1;
writer.add(element);
while (true) {
XMLEvent event = reader.nextEvent();
if (event.isStartElement() && event.asStartElement().getName().equals(name))
stack++;
if (event.isEndElement()) {
EndElement end = event.asEndElement();
if (end.getName().equals(name)) {
stack--;
if (stack == 0) {
writer.add(event);
break;
}
}
}
writer.add(event);
}
}
请检查 try 块中的函数调用writeToFile(reader, event, writer)。这里阅读器对象只有student 标签。我需要读者有school,class,然后是n students。以便生成的文件具有与原始文件类似的结构,只是每个文件的子项较少。
提前致谢。
【问题讨论】:
-
这不是代码生成服务。自己尝试(使用您找到的示例)并在遇到问题时发布具体问题。
-
然后发布您的尝试并解释您遇到的问题。我确实想提供帮助,但我不想成为代码生成服务(我不希望这个网站成为其中之一)。
-
请不要谴责声望大约是您的 260 倍的用户。
-
我想你可能要考虑使用 vtd-xml 来做,不仅会更快,而且更容易(你可以使用 xpath)