2

我正在尝试使用 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,它将具有以下行为:

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

4

1 回答 1

1

为什么不是 XmlParser?

更新

list = new XmlParser().parseText xml

widgetWithExplanations = list.breadthFirst()
  .findAll { it.buzz.text() == "true" }

masterList = widgetWithExplanations
  .collect { it.explanations.string*.text() }
  .flatten()

assert masterList == [
    "What is the meaning of life?", 
    "I like the color blue.", 
    "I could really go for some pizza right now."]


emptyExplanations = widgetWithExplanations
    .count { !it.explanations.string }

assert emptyExplanations == 0

否则,您的 domcategory 可能exp.text()在 for 循环中丢失。

于 2013-03-06T20:22:12.507 回答