2012-04-24 10 views
0

イムは、再帰的な方法で>> XMLファイルのすべての要素を取得し、ArrayListの中にそれを置くしようとしているが、私はエラーを取得し、JDOMでXMLファイルを解析する:スレッドの例外「メイン」のjava.lang java.util.ArrayListの.StackOverflowError。私は再帰呼び出し作るとき エラーが取得されます。GetAllXml(ListTreeを)。はエラーにStackOverflowError

私はこの[[[un]]、[[deux、trois、quatre]]、[cinq、six、sept]、[huit、noeuf]、[dix、onze]のようなstrcutureを取得したいここ

import java.util.ArrayList; 
import java.util.List; 
import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.NodeList; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.Element; 



public class esperant { 

/** 
* @param args 
*/ 


private static List<Element> getChildren(Node parent) 
{ 
    NodeList nl = parent.getChildNodes(); 
    List<Element> children = new ArrayList<Element>(nl.getLength()); 
    for (int i = 0; i < nl.getLength(); i++) { 
     Node n = nl.item(i); 
     if (n instanceof Element) 
      children.add((Element) n); 
    } 
    return children; 
} 


public static void GetAllXml(ArrayList<ArrayList<ArrayList<Element>>> ListTree) 
{ 
    ArrayList<ArrayList<Element>> child = new ArrayList<ArrayList<Element>>(); 

    int level = ListTree.size()-1; 

    for (int i=0;i<ListTree.get(level).size();i++) 
    { 

     for (int j=0;j<ListTree.get(level).get(i).size();j++) 
      { 
      ArrayList<Element> childOfChild = new ArrayList<Element>(); 
      childOfChild.addAll(getChildren(ListTree.get(level).get(i).get(j))); 
      child.add(childOfChild); 
      } 


    } 
    ListTree.add(child); 
    GetAllXml(ListTree); 
} 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    ArrayList<ArrayList<ArrayList<Element>>> ListTree = new ArrayList<ArrayList<ArrayList<Element>>>(); 
    ArrayList<ArrayList<Element>> child = new ArrayList<ArrayList<Element>>(); 
    ArrayList<Element> childOfChild = new ArrayList<Element>(); 
    try{ 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder parser = factory.newDocumentBuilder(); 
     Document doc = parser.parse("test.xml"); 
     Element root = doc.getDocumentElement(); 


     childOfChild.add(root); 
     child.add(childOfChild); 
     ListTree.add(child); 


     GetAllXml(ListTree); 




     System.out.println(ListTree); 



    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 


} 

} 

はXMLファイルです:

<?xml version="1.0" encoding="iso-8859-1"?> 
    <un> 
    <deux> <cinq></cinq> <six></six> <sept></sept> </deux> 
    <trois> <huit></huit><noeuf></noeuf> </trois> 
    <quatre><dix></dix><onze></onze> </quatre> 
    </un> 
+0

聖なる牛がこれは本当に必要なのか? ArrayListの >> –

+0

あなただけのArrayListを使用して、XML文書の全体のjavax表現を再構築しているようです。あなたのユースケースについてこれについて説明できますか? – Ina

+0

はい、残念ながら、私は質問を編集したもの –

答えて

1
はこのようにあなたのGetAllXml(X)を変更

、それが働くだろう。上記のように、この方法から脱出する方法はありません。

final ArrayList<ArrayList<Element>> child = new ArrayList<ArrayList<Element>>(); 

    final int level = ListTree.size() - 1; 

    for (int i = 0; i < ListTree.get(level).size(); i++) 
    { 

     for (int j = 0; j < ListTree.get(level).get(i).size(); j++) 
     { 
      final ArrayList<Element> childOfChild = new ArrayList<Element>(); 
      childOfChild.addAll(getChildren(ListTree.get(level).get(i).get(j))); 
      if (childOfChild.size() > 0) 
      { 
       child.add(childOfChild); 
      } 

     } 
    } 
    if (child.size() > 0) 
    { 
     ListTree.add(child); 
     GetAllXml(ListTree); 
    } 
0

GetAllXml(X)上のすべての呼び出しは、それがない任意の他、呼び出しGetAllXml(X)を終わる渡す]] ここに私のコードですその引数と同じ値。だからそれが無限に繰り返されることは明らかです。

関連する問題