So ändern Sie eine riesige XML-Datei mit StAX?
Ich habe eine riesige XML (~2GB) und ich muss hinzufügen neuer Elemente, und ändern Sie die alten. Ich habe zum Beispiel:
<books>
<book>....</book>
...
<book>....</book>
</books>
Möchten:
<books>
<book>
<index></index>
....
</book>
...
<book>
<index></index>
....
</book>
</books>
Ich verwendete den folgenden code:
XMLInputFactory inFactory = XMLInputFactory.newInstance();
XMLEventReader eventReader = inFactory.createXMLEventReader(new FileInputStream(file));
XMLOutputFactory factory = XMLOutputFactory.newInstance();
XMLStreamWriter writer = factory.createXMLStreamWriter(new FileWriter(file, true));
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.getEventType() == XMLEvent.START_ELEMENT) {
if (event.asStartElement().getName().toString().equalsIgnoreCase("book")) {
writer.writeStartElement("index");
writer.writeEndElement();
}
}
}
writer.close();
Aber das Ergebnis war das folgende:
<books>
<book>....</book>
....
<book>....</book>
</books><index></index>
Irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, diese
Hinweise
new FileWriter(Datei, true) Anhängen am Ende der Datei, die Sie kaum wirklich brauchen, es
equalsIgnoreCase("Buch") ist eine schlechte Idee, weil XML ist case-sensitive
Nun, es ist ziemlich klar, warum es sich so verhält, wie Sie es tut. Was Sie tatsächlich tun, ist das öffnen der vorhandenen Datei im output-append-Modus und schreiben von Elementen am Ende. Das widerspricht deutlich dem, was Sie versuchen zu tun.
(Beiseite: ich bin überrascht, dass es funktioniert so gut es tut, gegeben, dass die input-Seite ist wahrscheinlich, um die Elemente anzuzeigen, die der output-Seite wird Hinzugefügt, um das Ende der Datei. Und in der Tat Ausnahmen wie Evgeniy Dorofeev Beispiel gibt, sind die Art von Sache, die ich erwarten würde. Das problem ist, dass, wenn Sie versuchen, Lesen und schreiben einer text-Datei zur gleichen Zeit, und entweder die reader oder writer verwendet jede form von Puffern, explizite oder implizite, dem Leser haftet, um zu sehen, teilweise Staaten.)
Dieses Problem zu beheben, müssen Sie starten Sie durch das Lesen von einer Datei und schreiben in eine andere Datei. Anhängen funktioniert nicht. Dann haben Sie zu vereinbaren, dass die Elemente, Attribute, Inhalte, etc, die gelesen werden, von der input-Datei kopiert, um die Ausgabe-Datei. Schließlich müssen Sie fügen Sie zusätzliche Elemente, die an den entsprechenden stellen.
Nicht. Das ist theoretisch unmöglich. Um navigieren zu können, um eine XML-Datei-Struktur in eine "random" - Datei, Sie würden zuerst müssen, analysieren das ganze und einen index zu erstellen, wo alle Elemente sind. Selbst wenn Sie das getan haben, die XML-Daten immer noch gespeichert als Zeichen in der Datei, und random access können Sie nicht einfügen und entfernen von Zeichen in der Mitte einer Datei.
Vielleicht Ihre beste Wette wäre, die Kombination von XSL und SAXOPHON Stil-parser; z.B. etwas entlang der Linien von dieser IBM-Artikel: http://ibm.com/developerworks/xml/library/x-tiptrax
Vielleicht StAX-Lesen-und-Schreiben-Beispiel in Java ee tutorial hilft: http://docs.oracle.com/javaee/5/tutorial/doc/bnbfl.html#bnbgq
Laden Sie die tutorial-Beispiele hier: https://java.net/projects/javaeetutorial/downloads
Für den schnellen Zugriff, das genannten Beispiel ist hier: .htm">http://read.pudn.com/downloads79/ebook/304101/javaeetutorial5/examples/stax/readnwrite/src/readnwrite/EventProducerConsumer.java_.htm