0

JDOMを使用してXMLファイルを解析し、彼のすべての要素からいくつかの情報を取得する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <element1>something</element1>
    <element2>
        <subelement21>moo</subelement21>
        <subelement22>
            <subelement221>toto</subelement221>
            <subelement222>tata</subelement222>
        </subelement22>
    </element2>
</root> 

したがって、element1の場合は簡単です。しかし、element2の場合、私は彼の子供を通過する必要があり、子供が子供を持っている場合は、それらも通過します。

public static void getInfos(Vector<String> files) {     
    Document document = null;
    Element root = null;

    SAXBuilder sxb = new SAXBuilder();

    for (int i =0 ; i< files.size() ; i++)
    {
        System.out.println("n°" + i + " : " + files.elementAt(i));
        try
        {
            document = sxb.build(files.elementAt(i));
            root = document.getRootElement();

            List<?> listElements = root.getChildren();
            Iterator<?> it = listElements.iterator();

            while(it.hasNext())
            {
                Element courant = (Element)it.next();
                System.out.println(courant.getName());

                if(courant.getChildren().size() > 0)
                {
                    // here is the problem -> the element has a children
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }   
    }
}

この場合、再帰呼び出しなど、同じ関数を使用できるようにするために、何を提案しますか。

ありがとう。

4

2 に答える 2

1

私はSAXを使用します。ドキュメント内の現在のパスを追跡する contenthandler にスタックを保持し、文字メソッドが追加されたバッファーを保持します。endElement では、バッファからコンテンツを取得してクリアし、現在のパスを使用してそれをどうするかを決定します。

(これは、このドキュメントに混合コンテンツがないことを前提としています。)

SAX を使用して複雑な XML ドキュメントを処理する方法に関する記事へのリンクを次に示します。この記事では、私が簡単に説明したことを、再帰的なデータ構造を処理するアプローチにまで拡張しています。( SAX の紹介である前身の記事もあります。)

于 2011-08-16T15:26:50.633 に答える
0

XPathを使用して、必要な要素を正確に取得することを検討できます。この例は名前空間を使用していますが、基本的な考え方はそのままです。

于 2011-08-16T15:56:02.313 に答える