Comment modifier un énorme fichier XML par StAX?
J'ai un énorme XML (~2 GO) et j'ai besoin d'ajouter de nouveaux Éléments et de modifier les anciens. Par exemple, j'ai:
<books>
<book>....</book>
...
<book>....</book>
</books>
Et que vous souhaitez obtenir:
<books>
<book>
<index></index>
....
</book>
...
<book>
<index></index>
....
</book>
</books>
J'ai utilisé le code suivant:
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();
Mais le résultat a été le suivant:
<books>
<book>....</book>
....
<book>....</book>
</books><index></index>
Des idées?
OriginalL'auteur Eugene | 2013-05-10
Vous devez vous connecter pour publier un commentaire.
Essayer cette
Notes
new FileWriter(fichier, true) est l'ajout à la fin du fichier, vous avez à peine vraiment besoin
equalsIgnoreCase("livre") est une mauvaise idée parce que le XML est sensible à la casse
quel est l'exception? Je l'ai testé avec votre xml avant de poster
Ont juste essayé. Et de nouveau la même exception: "Provoquée par: javax.xml.flux de données.XMLStreamException: ParseError à [row,col]:[3,5] Message: structures de document XML doit de début et de fin au sein de la même entité. au com.soleil.org.apache.xerces.interne.impl.XMLStreamReaderImpl.prochaine(XMLStreamReaderImpl.java:598) au com.soleil.xml.interne.flux de données.XMLEventReaderImpl.nextEvent(XMLEventReaderImpl.java:83) au bibliothécaire.les contrôleurs.BookCardController.saveToXML(BookCardController.java:138) ... plus de 54' je ne sais pas vraiment pourquoi, mais en plus, ce code efface de mon fichier.
regarde comme le xml d'entrée est cassée, lecteur cant l'analyser
Eh bien, il semble que cette exception est parce que j'ai utilisé le même fichier d'entrée et de sortie. Après le choix de la destination différente fichier le code commencé à travailler, mais... le résultat a été le suivant: '<index></index><index></index><index></index><index></index><index></index><index></index><index></index>'. Et j'ai besoin d'inclure l'Élément dans le XML existant.
OriginalL'auteur Evgeniy Dorofeev
Eh bien, il est assez clair pourquoi il se comporte de cette façon. Ce que vous êtes en train de faire, c'est ouvrir le fichier existant en sortie en mode ajout et l'écriture des éléments à la fin. Ce qui contredit clairement ce que vous essayez de faire.
(Côté: je suis surpris que cela fonctionne aussi bien comme il le fait étant donné que le côté de l'entrée est susceptible de voir les éléments que le côté de sortie est ajoutée à la fin du fichier. Et en effet, les exceptions comme Evgeniy Dorofeev l'exemple donne sont le genre de chose que je m'attends. Le problème est que si vous tentez de lire et écrire un fichier texte dans le même temps, et le lecteur ou écrivain utilise aucune forme de mise en mémoire tampon, explicite ou implicite, le lecteur est responsable de voir partielle unis.)
Pour corriger cela, vous devez commencer par la lecture d'un fichier et écrire dans un fichier différent. Ajoutant ne fonctionne pas. Ensuite, vous avez à faire en sorte que les éléments, les attributs, le contenu, etc ... qui sont lus à partir du fichier d'entrée sont copié pour le fichier de sortie. Enfin, vous devez ajouter les éléments supplémentaires aux endroits appropriés.
Pas. C'est théoriquement impossible. Afin d'être en mesure de naviguer dans un fichier XML de la structure dans un "hasard" du fichier, vous auriez besoin d'abord d'analyser l'ensemble de la chose et de construire un indice de l'endroit où tous les éléments sont. Même lorsque vous avez fait cela, le XML est toujours stockée en tant que caractères dans un fichier, d'accès aléatoire et ne permet pas d'insérer et de supprimer des caractères dans le milieu d'un fichier.
Peut-être votre meilleur pari serait combinant XSL et un SAX style de l'analyseur; par exemple, quelque chose le long des lignes de cette IBM article: http://ibm.com/developerworks/xml/library/x-tiptrax
Il est théoriquement possible ... je crois ... mais je ne suis pas au courant de tout hors-the-shelf solution, qui est ce que vous voulez.
OriginalL'auteur Stephen C
Peut-être que ce StAX de Lecture et d'Écriture Exemple dans JavaEE tutoriel aide: http://docs.oracle.com/javaee/5/tutorial/doc/bnbfl.html#bnbgq
Vous pouvez télécharger le tutoriel exemples ici: https://java.net/projects/javaeetutorial/downloads
Pour un accès rapide, l'exemple est ici: .htm">http://read.pudn.com/downloads79/ebook/304101/javaeetutorial5/examples/stax/readnwrite/src/readnwrite/EventProducerConsumer.java_.htm
OriginalL'auteur kristjanroosild