1

次のような構造の XML ファイルがあります。

<element1>
    <element2>
        <element3>
            <elementIAmInterestedIn attribute="data">
                <element4>
                    <element5>
                        <element6>
                            <otherElementIAmInterestedIn>
                                <data1>text1</data1>
                                <data2>text2</data2>
                                <data3>text3</data3>
                            </otherElementIAmInterestedIn>
                        </element6>
                    </element5>
                </element4>
            </elementIAmInterestedIn>
            <elementIAmInterestedIn attribute="data">
                <element4>
                    <element5>
                        <element6>
                            <otherElementIAmInterestedIn>
                                <data1>text1</data1>
                                <data2>text2</data2>
                                <data3>text3</data3>
                            </otherElementIAmInterestedIn>
                        </element6>
                    </element5>
                </element4>
            </elementIAmInterestedIn>
            <elementIAmInterestedIn attribute="data">
                <element4>
                    <element5>
                        <element6>
                            <otherElementIAmInterestedIn>
                                <data1>text1</data1>
                                <data2>text2</data2>
                                <data3>text3</data3>
                            </otherElementIAmInterestedIn>
                        </element6>
                    </element5>
                </element4>
            </elementIAmInterestedIn>
        </element3>
    </element2>
</element1>

ご覧のとおり、私は 2 つの要素に関心があります。最初の要素はルート要素内に深くネストされており、2 番目の要素は最初の要素内に深くネストされています。ドキュメント内に複数の (兄弟) elementIAmInterestedIn 要素と otherElementIAmInterestedIn 要素があります。

この XML ファイルを Java で解析し、すべての elementIAmInterestedIn および otherElementIAmInterestedIn 要素からのデータをデータ構造または Java オブジェクトのいずれかに配置したいと考えています。

すべての要素に触れるように、XML の深さ優先走査を行う再帰的な DOM パーサー メソッドを作成できました。また、elementIAmInterestedIn を表す JAXB アノテーションを使用して Java クラスを作成しました。次に、再帰メソッドで、いつ elementIAmInterestedIn に到達したかを確認し、それを JAXB クラスのインスタンスに非整列化します。このようなオブジェクトには複数の otherElementIAmInterestedIn も含まれている必要があることを除いて、これは正常に機能します。

これは私が立ち往生しているところです。otherElementIAmInterestedIn からデータを取得して JAXB オブジェクトに割り当てるにはどうすればよいですか? @XmlWrapper アノテーションを見たことがありますが、これはネストの 1 つのレイヤーでしか機能しないようです。また、@XmlPath も使用できません。

たぶん、その考えを捨てて、まったく新しいアプローチを使用する必要があります。私は本当に XML 解析を始めたばかりなので、より明白な解決策を見落としている可能性があります。このように構造化された XML ドキュメントをどのように解析し、データを整理して保存しますか?

4

1 に答える 1

2

DOM の代わりに SAX パーサーを使用する必要があるかもしれません。DOM を使用すると、すべてのドキュメントがメモリに読み込まれます。この場合、2 つのフィールドのみを読みたいとします。これはかなり非効率的です。

sax パーサーを使用すると、関心のあるノードのみを読み取ることができます。SAX 解析モデルを使用したタスクの疑似コードを次に示します。

<elementInterestedIn>1)ノードを取得するまでノードを読み続けます

2)クラスでそのフィールドを取得します

<otherElementInterestedIn>3)ノードを取得するまで読み続けます

4) そのフィールドも取得して、オブジェクトを保存します。

ドキュメントの最後に到達するまで、1 から 4 までループします。

このアプローチを試す場合は、最初にこのドキュメントを読んで SAX パーサーがどのように機能するかを理解することをお勧めします。これは DOM アプローチとは大きく異なります: SAX の使用方法

于 2013-06-12T01:56:39.450 に答える