2013-03-06 102 views
2

我試圖使用Groovy來解析以下XML: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串:從第3小部件

到目前爲止,這是我最好的嘗試2從第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大師都能找到我要去哪裏?提前致謝。

+0

變量buzzesExist永遠不會回到錯誤,所以在第一個小部件發出嗡嗡聲之後,您將alwazs做第二次 – iberbeu 2013-03-06 19:45:53

+0

好抓,但沒關係。稍後在腳本中,我檢查是否有'buzzesExist',並使用它做其他一些事情。 – IAmYourFaja 2013-03-06 19:49:08

+0

你到底在做什麼? – iberbeu 2013-03-06 19:52:59

回答

1

爲什麼不使用XmlParser?

UPDATE

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可能缺失​​裏面的for循環。

+0

謝謝@威爾P(+1) - 兩次跟進:我將如何檢查'說明'大小是否爲0,並將其保存到布爾中,(2)如何保存解釋到名爲'masterList'的名單?再次感謝! – IAmYourFaja 2013-03-06 20:25:41

+0

已更新。現在它計算有多少解釋是空的(變量'emptyExplanations'),並將字符串保存在一個'masterList'變量中 – Will 2013-03-06 20:33:35

+0

再次感謝@ @ P!最後的跟進,我保證! 「XmlParser」存儲在哪個包中?我無法在Java 6或Java 7中找到它。我需要使用哪些導入語句將其導入腳本並使其可用?再次感謝! – IAmYourFaja 2013-03-06 20:48:23