2012-04-24 86 views
0

即時通訊嘗試獲取XML文件的所有元素,並將其放入一個ArrayList >>用遞歸方法,但我得到一個錯誤:線程「main」java.lang中的異常java.util.ArrayList中的.StackOverflowError。 當我進行遞歸調用時出現錯誤:GetAllXml(ListTree);用JDOM解析一個XML文件,錯誤StackOverflowError

我想要得到這樣的結果[[[un]],[[deux,trois,quatre]],[[cinq,six,sept],[huit,noeuf],[dix,onze] ]] 這裏是我的代碼:

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 >> – 2012-04-24 18:46:41

+0

您似乎只是使用ArrayLists重建XML文檔的整個javax表示形式。你能解釋一下你的用例嗎? – Ina 2012-04-24 18:56:34

+0

是的不幸的是,我想要一個這樣的結構 – 2012-04-24 18:57:41

回答

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)經過與其論證相同的價值。所以很明顯它會無限遞歸。