Bonjour à tous ,
Contexte :
pour extraire certaines information d'un fichier xml ( en EAD) ,il me faut parcourir la globalité de plusieurs fichier xml , de taille assez conséquente (entre 10 et 4098 ko).
Les règles d'extractions étant très complexe je suis donc parti dans un premier lieu dans un listing de toutes les balises.
J’initialise mon fichier à traiter :
Je lance ma fonction récursive :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilder = documentBuilderFactory.newDocumentBuilder(); document = documentBuilder.parse(xmlInputFile)
Dont voici le code note que le 3ieme param ne sert à rien, je voulais voir si mon souci venait de la déclaration de ma str)
Code : Sélectionner tout - Visualiser dans une fenêtre à part getEADxmlInformation(document,0,"");
résultats:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 public static String getEADxmlInformation(Node node,int deep, String Inf) { //compteur de profondeur int cptdeep=deep; //str avec le nom du noeud Inf=node.getNodeName(); //si "nouveau noeud" affiche le nom avec la bonne profondeur if(Inf!="#text"){ for(int i=0;i<cptdeep;i++){ System.out.print("#"); } System.out.println(Inf); } else{ //souci avec les retours "retour chariot" qui me donne des "#text" //System.out.println("wtf"); } //appel récursif si fils if (node.hasChildNodes()){ getEADxmlInformation(node.getFirstChild(),cptdeep+1,""); } //sinon appel récursif si(et sur) noeud suivant else if(node.getNextSibling()!=null) { getEADxmlInformation(node.getNextSibling(),cptdeep,""); } //sinon appel récursif si(et sur) noeuf suivant du parent else if(node.getParentNode().getNextSibling()!=null ){ getEADxmlInformation(node.getParentNode().getNextSibling(),cptdeep-1,""); } return Inf; }
#document
#ead
#ead
##eadheader
###eadid
###filedesc
####titlestmt
#####titleproper
#####author
#####sponsor
####publicationstmt
#####publisher
etc
très bien, c'est ce que je voulais
ps : si je décote le syso"wtf"
#document
#ead
#ead
wtf
##eadheader
wtf
###eadid
wtf
wtf
###filedesc
wtf
####titlestmt
wtf
problèmes:
lorsque la taille des fichiers augmentes ( au delà de 200K) , j'obtiens :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 xception in thread "main" java.lang.StackOverflowError at java.nio.Buffer.<init>(Buffer.java:170) at java.nio.CharBuffer.<init>(CharBuffer.java:259) at java.nio.HeapCharBuffer.<init>(HeapCharBuffer.java:52) at java.nio.CharBuffer.wrap(CharBuffer.java:350) at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:246) at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106) at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190) at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111) at java.io.PrintStream.write(PrintStream.java:476) at java.io.PrintStream.print(PrintStream.java:619) at JDOM.DPICGM.getEADxmlInformation(DPICGM.java:167) at JDOM.DPICGM.getEADxmlInformation(DPICGM.java:179) at JDOM.DPICGM.getEADxmlInformation(DPICGM.java:181) ... etc
généralement j'ai environ 1020 "JDOM.DPICGM.getEADxmlInformation(DPICGM.java:1XX)
Questions:
-Pourquoi ? Étant donné que pour des petits fichiers cela fonctionne (est-ce que c'est une limite d'appel récursif ?, mémoire ?)
- J'ai l'impression de quand même de réinventé la roue, est-ce qu'il n'y a pas plus simple ?
-"Bonus"- les "wtf", quelqu'un à une idée ?
Voilà merci d'avance à ceux qui me liront, qui m'aideront.
Pegaz
Partager