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: et souhaitez obtenir: p> J'ai utilisé le code suivant: p> <books>
<book>....</book>
....
<book>....</book>
</books><index></index>
3 Réponses :
Eh bien, il est assez clair pourquoi il se comporte comme ça. Ce que vous faites réellement, c'est ouvrir le fichier existant en mode d'append de sortie et les éléments d'écriture à la fin. Qui contradictent clairement ce que vous essayez de faire. P>
(Misté: je suis surpris que cela fonctionne aussi bien que, étant donné que le côté des intrants est susceptible de voir les éléments que le côté de sortie est ajouté à la fin du fichier. Et en effet les exceptions comme l'exemple de Evgeniy Dorofev donne le genre de chose que j'attendais. Le problème est que si vous essayez de lire et d'écrire un fichier texte en même temps, et que le lecteur ou l'écrivain utilise toute forme de mise en mémoire tampon, explicite ou implicite, le lecteur est responsable. voir des états partiels.) p>
Pour résoudre ce problème, vous devez commencer par lire un fichier et écrire dans un fichier différent. Ajout ne fonctionnera pas. Ensuite, vous devez organiser que les éléments, les attributs, le contenu, etc. qui sont lus à partir du fichier d'entrée sont copiés em> dans le fichier de sortie. Enfin, vous devez ajouter les éléments supplémentaires aux points appropriés. P>
et y a-t-il une possibilité d'ouvrir le fichier XML en mode comme aléatoireAccessfile, mais écrivez-y par des méthodes de stax? P>
blockQuote>
Non. C'est théoriquement impossible. Afin de pouvoir naviguer autour d'une structure de fichier XML dans un fichier "aléatoire", vous devez d'abord analyser le tout et construire un index de l'endroit où tous les éléments sont. Même lorsque vous avez fait cela, le XML est toujours stocké sous forme de caractères dans un fichier et l'accès aléatoire ne vous permet pas d'insérer et de supprimer des caractères au milieu d'un fichier. p>
Peut-être que votre meilleur pari allierait XSL et un analyseur de style SAX; par exemple. Quelque chose dans le sens de cet article IBM: http://ibm.com/developerworks/xml/ Bibliothèque / X-Tiptrax P>
Essayez ceci notes p> nouveau FileWriter (fichier, true) est également ajouté à la fin du fichier, vous en avez vraiment vraiment besoin P> < p> Equalsignorecase ("Book") est une mauvaise idée car XML est sensible à la casse p> p>
Malheureusement, ce code ne fonctionne pas. NetBeans me donne une erreur: «Causé par: Javax.xml.stream.xmlstreamException: ParseError à [ligne, Col]: [4,2] Message: Les structures de document XML doivent commencer et se terminer dans la même entité. à com.sun.org.apache.xerces.internal.impl.xmlstreamreaderimpl. Suivant (xmlstreamreader Impl.java:598) à com.sun.xml.internal.stream.xmleventreaderimpl.nextEvent (XML EventReaderImpl.java : 83) à bibliothécaire.controls.bookcardcontroller.savetoxml (Bookcardc Ontroller.java:140) Et en outre, il supprime tous les contenus du fichier ...
Quelle est l'exception? Je l'ai testé avec votre XML avant de poster
Viens de l'essayer. Et encore une fois la même exception: «Causé par: Javax.xml.stream.xmlstreamException: Paréserror à [ligne, Col]: [3,5] Message: Les structures de document XML doivent commencer et se terminer dans la même entité. à com.sun.org.apache.xerces.internal.impl.xmlstreamreaderimpl. Suivant (xmlstreamreader Impl.java:598) à com.sun.xml.internal.stream.xmleventreaderimpl.nextEvent (XML EventReaderImpl.java : 83) à bibliothécaire.controls.bookcardcontroller.savetoxml (bookcardc ontroller.java:138) Je ne sais vraiment pas pourquoi, mais aussi, ce code efface mon fichier.
Eh bien, il semble que cette exception soit parce que j'ai utilisé le même fichier que l'entrée et la sortie. Après avoir choisi le fichier de destination différent, le code a commencé à travailler, mais ... la sortie était la suivante: '
Si vous ne laissez que cet événement xmlevent = eventReader.nextEvent (); écrivain.add (événement); Dans la boucle, vous êtes censé obtenir une entrée de sortie ==, il ne peut pas être perdu, essayez de déboguer
Oh, c'était mon erreur. J'ai accidentellement supprimer cette ligne. Oui, ça marche grandement. Merci beaucoup. Mais maintenant j'ai une autre question. J'ai essayé de faire cela avec un fichier de 40 Mo et il m'a fallu 2,5 à 3 secondes, et si j'utilise 2 Go de fichier, cela me prendra près de 3 minutes! Y a-t-il une possibilité d'accélérer ce code?
Je ne sais pas que cela aidera mais la peine d'essayer: modifier le FileWriter vers un nouveau bufferedOutPutStream (nouveau fichierInputtream (fichier)) et FileInputStream avec nouveau bufferedInputStream (nouveau fichierInputtream (fichier))
J'ai déjà essayé, mais cela ne donne qu'une économie de 50 à 100 millisecondes. D'accord, merci beaucoup. Tu m'as vraiment aidé!
Peut-être que cet exemple de lecture-and-write Stax dans le didacticiel Javae aide: http://docs.oracle.com/javae/5/tutorial/doc/bnbfl.html#bnbgq p>
Vous pouvez télécharger les exemples de didacticiel ici: https://java.net/projects/javaeettuny/downloads p>