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. 2 番目list/list/widget/buzztrueであるため、文字列集約モード を使用します。
    1. 2 番目list/list/widget/explanationsには 2人の<string/>子供がいます。両方をマスターリストに追加 ( masterList)
  3. 3 番目 list/list/widget/buzzは ですtrue。その子の文字列を引き続きマスター リストに集約します。
    1. 3 番目list/list/widget/explanationsには 1<string/>人の子供がいます。マスターリストに追加 ( masterList)
  4. にはmasterList3 つの文字列が含まれています。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 の専門家は、私が間違っている場所を見つけることができますか? 前もって感謝します。

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 に答える