使用StAX我有以下形式的200 MB的xml:代碼在Java
<school name = "some school">
<class standard = "2A">
<student>
.....
</student>
<student>
.....
</student>
<student>
.....
</student>
</class>
</school>
我需要這個XML分割成幾個文件使用StAX這種n個學生在每個XML文件來,並且其結構被保存爲<school>
,然後<class>
和<students>
。學校和班級的屬性也必須保留在最終的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);
}
}
請檢查函數調用writeToFile(reader, event, writer)
try塊。這裏讀者對象只有student
標籤。我需要的讀者有school
,class
,然後在其中有students
。因此生成的文件與原始文件具有相似的結構,但每個文件只有較少的子文件。
在此先感謝。
這不是一個代碼生成服務。嘗試一下(使用你找到的樣本),並在遇到問題時發佈**具體**問題。 –
然後**發佈**你試圖和**解釋**你卡在哪裏。我**願意幫忙,但我不想成爲一個代碼生成服務(我不希望這個網站成爲一個)。 –
請不要以約260倍的聲譽譴責用戶。 – musiKk