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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilder = documentBuilderFactory.newDocumentBuilder();
document = documentBuilder.parse(xmlInputFile)
Je lance ma fonction récursive :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
getEADxmlInformation(document,0,"");
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
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;
	}
résultats:

#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