Groovy を使用して次の XML を解析しようとしています。
<list>
<list>
<widget>
<fizz id="3" />
<buzz>false</buzz>
<explanations/>
</widget>
<widget>
<fizz id="3" />
<buzz>true</buzz>
<explanations>
<string>What is the meaning of life?</string>
<string>I like the color blue.</string>
</explanations>
</widget>
<widget>
<fizz id="45" />
<buzz>true</buzz>
<explanations>
<string>I could really go for some pizza right now.</string>
</explanations>
</widget>
</list>
</list>
<widget/>
要素に子がある場合、true
<buzz/>
すべてのexplanations/string
子をマスターに集約し始めList<String>
ます。したがって、上記のサンプル XML の場合、次のように動作します。
- 最初
list/list/widget/buzz
はfalse
ですので、何もしないでください - 2 番目
list/list/widget/buzz
はtrue
であるため、文字列集約モード を使用します。- 2 番目
list/list/widget/explanations
には 2人の<string/>
子供がいます。両方をマスターリストに追加 (masterList
)
- 2 番目
- 3 番目
list/list/widget/buzz
は ですtrue
。その子の文字列を引き続きマスター リストに集約します。- 3 番目
list/list/widget/explanations
には 1<string/>
人の子供がいます。マスターリストに追加 (masterList
)
- 3 番目
- には
masterList
3 つの文字列が含まれています。2 番目のウィジェットから 2 つ、3 番目のウィジェットから 1 つです。
これまでのところ、これが私の最善の試みです:
boolean buzzesExist = false;
List<String> masterList = new ArrayList<String>();
use(DOMCategory) {
element.normalize();
element.'widget'.each { widget ->
// If widget/buzz is true, then buzzes exist.
if(widget.'buzz'.text) {
buzzesExist = true;
}
// If buzzes exist, then aggregate all explanation strings into
// into "masterList".
if(buzzesExist) {
for(String exp : widget.'explanations')
masterList.add(exp);
}
}
これは実行masterList
されますが、あらゆる種類の奇妙な DOM が含まれます (大きすぎて貼り付けることができません)。Groovy の専門家は、私が間違っている場所を見つけることができますか? 前もって感謝します。