我正在尝试使用 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
,所以不要做任何事情 - 二
list/list/widget/buzz
是true
,所以搞字符串聚合模式:- 第二个
list/list/widget/explanations
有2个<string/>
孩子;将它们都添加到主列表 (masterList
)
- 第二个
- 第三
list/list/widget/buzz
是true
,所以继续将其子字符串聚合到主列表中。- 第三个
list/list/widget/explanations
有1个<string/>
孩子;将其添加到主列表 (masterList
)
- 第三个
- 现在
masterList
有 3 个字符串:2 个来自第二个小部件,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 大师都可以发现我要去哪里吗?提前致谢。