0

XMLファイルのすべての要素を取得し、再帰メソッドを使用してArrayList >>に配置しようとしていますが、エラーが発生します:java.util.ArrayListのスレッド"main"java.lang.StackOverflowErrorで例外が発生します。再帰呼び出しを行うとエラーが発生します:GetAllXml(ListTree);

このような構造を取得したい[[[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>
4

2 に答える 2

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);
    }
于 2012-05-02T07:50:16.877 に答える
0

GetAllXml(X) のすべての呼び出しは、それが何をするにせよ、引数として同じ値を渡して GetAllXml(X) を呼び出すことになります。したがって、無限に再帰することは明らかです。

于 2012-04-24T22:26:55.250 に答える