2012-01-27 59 views
0

您好我有這樣處理嵌套列表生成圖形數據

udbList=[ 
     [132, 2011-11-28 00:00:00.0, Save Object], 
      [141, 2011-11-29 00:00:00.0, Save Object], 
      [133, 2011-11-29 00:00:00.0, Read Object], 
      [182, 2011-12-01 00:00:00.0, Save Object], 
      [119, 2011-12-02 00:00:00.0, Read Object], 
      [11, 2011-12-03 00:00:00.0, Write Object], 
      [12, 2011-12-04 00:00:00.0, Save Object] 
      ] 

我創建它生成圖表出這一個dataXML列表結構的列表。 該類型的圖表是一個多 - 由日線圖中的每一行代表事件(的列表 - 保存最後一個值/讀/寫)

像這樣

dataXML+="<dataset seriesname='"<event type>"' color='""' lineThickness='2'>" 
udbList.each{ 
    dataXML += "<set value='"+it[0]+"'/>" //for that event type populate all count values (1st field in the list) 
} 

我有udbList填充,我怎麼寫邏輯形成dataXML

終於爲樣本名單上面,我應該有這樣

def dataXML = "<graph caption='s' lineThickness='3' rotateNames='1'>" + " 
     <categories> 
     //Logic to iterate through udbList and insert all dates 
     <category name='2011-11-28'/> 
     <category name='2011-11-29'/> 
     <category name='2011-12-01'/> 
     <category name='2011-12-02'/> 
     <category name='2011-12-03'/> 
     <category name='2011-12-04'/> 
    </categories> 
    <dataset seriesname='Save Object' color='""' lineThickness='2'>" + 
    <set value='132'/> 
    <set value='141'/> 
    <set value='182'/> 
    <set value='0'/> // 0 because no value for event Save Object on 2011-12-02 
    <set value='0'/> // 0 because no value for event Save Object on 2011-12-03 
    <set value='12'/> 
    </series> 
    <dataset seriesname='Read Object' color='""' lineThickness='2'>" 
    <set value='0'/> 
    <set value='133'/> 
    <set value='0'/> 
    <set value='119'/> 
    <set value='0'/> 
    <set value='0'/> 
    </series> 
    <dataset seriesname='Write Object' color='""' lineThickness='2'>" 
    <set value='0'/> 
    <set value='0'/> 
    <set value='0'/> 
    <set value='0'/> 
    <set value='11'/> 
    <set value='0'/> 
    </series> 
</graph> 

所以我NE的dataXML編輯插入'<set value='0'/>'當日期上沒有特定事件類型的結果 如何從列表中獲取此dataXML?

更新: 如果你想使用MarkupBuilder的有在你的XML格式的「設置」標籤,你需要檢查這個MarkupBuilder的Grails的問題grails issue 5525

回答

2

您可以使用MarkupBuilder此:

def udbList = [ 
    [132, "2011-11-28 00:00:00.0", "Save Object"], 
    [141, "2011-11-29 00:00:00.0", "Save Object"], 
    [133, "2011-11-29 00:00:00.0", "Read Object"], 
    [182, "2011-12-01 00:00:00.0", "Save Object"], 
    [119, "2011-12-02 00:00:00.0", "Read Object"], 
    [11, "2011-12-03 00:00:00.0", "Write Object"], 
    [12, "2011-12-04 00:00:00.0", "Save Object"] 
] 

// Unique dates. 
def dates = udbList.collect { it[1] }.unique() 

def xml = new groovy.xml.MarkupBuilder() 

xml.graph(caption:'s', lineThickness:'3', rotateNames:'1') { 
    categories { 
     dates.each { date -> 
      // Output dates in yyyy-MM-dd format. 
      category(name: date.split()[0]) 
     } 
    } 
    series { 
     // For each event type output a "dataset" tag and "set" tags for each 
     // date. 
     ['Save Object', 'Read Object', 'Write Object'].each { type -> 
      dataset(seriesname: type, color: '', lineThickness: '2') { 
       dates.each { date -> 
        def val = udbList.find { it[1] == date && it[2] == type} 
        set(value: val ? val[0] : 0)     
       } 
      } 
     } 
    } 
} 

println xml.toString() 

輸出是:

<graph caption='s' lineThickness='3' rotateNames='1'> 
    <categories> 
    <category name='2011-11-28' /> 
    <category name='2011-11-29' /> 
    <category name='2011-12-01' /> 
    <category name='2011-12-02' /> 
    <category name='2011-12-03' /> 
    <category name='2011-12-04' /> 
    </categories> 
    <series> 
    <dataset seriesname='Save Object' color='' lineThickness='2'> 
     <set value='132' /> 
     <set value='141' /> 
     <set value='182' /> 
     <set value='0' /> 
     <set value='0' /> 
     <set value='12' /> 
    </dataset> 
    <dataset seriesname='Read Object' color='' lineThickness='2'> 
     <set value='0' /> 
     <set value='133' /> 
     <set value='0' /> 
     <set value='0' /> 
     <set value='119' /> 
     <set value='0' /> 
    </dataset> 
    <dataset seriesname='Write Object' color='' lineThickness='2'> 
     <set value='0' /> 
     <set value='0' /> 
     <set value='0' /> 
     <set value='0' /> 
     <set value='11' /> 
     <set value='0' /> 
    </dataset> 
    </series> 
</graph> 

更新:這是幾乎相同Dave Newton's answer,唯一diffrence的是,這一次發生的日期考慮多種事件類型。

+0

我遇到的一個小問題是我的標題,其他一些屬性在某處插入到我的xml中,試圖執行此操作:xml.graph(caption:'「+ mycaption +」',lineThickness:'3',rotateNames :'1')其中def mcaption ='user dashboard' – 2012-01-27 04:11:38

+0

@pri_dev如果'mycaption'是一個變量,你可以插入一個像'xml.graph(caption:「\」+「mycaption + \」「,lineThickness :'3',rotateNames:'1')'。如果'mycaption =='Something「',那會給你標籤'' – epidemian 2012-01-27 04:15:35

+0

好的。這應該工作我猜XML。圖(標題:myCaption,subCaption:....) – 2012-01-27 04:18:37

2

粗略地(不是最有效的,再次假設假數據,以及這是一個日期,而不是一個字符串):

import groovy.xml.MarkupBuilder 

l2 = udbList.sort { it[1] } 
series = ['Save Object', 'Read Object', 'Write Object'] 

def writer = new StringWriter() 
def xml = new MarkupBuilder(writer) 
xml.graph(caption: 's', lineThickness: '3', rotateNames: '1') { 
    categories { 
    l2.each { 
     category(name: "${it[1].format('yyyy-MM-dd')}") 
    } 
    } 

    series.each { s -> 
    dataset(seriesname: "${s}", color: '', lineThickness: '2') { 
     l2.collect { s == it[2] ? it[0] : 0 }.each { 
     set(value: "${it}") 
     } 
    } 
    } 
} 

println writer.toString() 

輸出(假設你的榜樣輸出並不意味着</series>):

<graph caption='s' lineThickness='3' rotateNames='1'> 
    <categories> 
    <category name='2012-01-26' /> 
    <category name='2012-01-26' /> 
    <category name='2012-01-26' /> 
    <category name='2012-01-26' /> 
    <category name='2012-01-26' /> 
    <category name='2012-01-26' /> 
    <category name='2012-01-26' /> 
    </categories> 
    <dataset seriesname='Save Object' color='' lineThickness='2'> 
    <set value='182' /> 
    <set value='0' /> 
    <set value='141' /> 
    <set value='132' /> 
    <set value='0' /> 
    <set value='0' /> 
    <set value='12' /> 
    </dataset> 
    <dataset seriesname='Read Object' color='' lineThickness='2'> 
    <set value='0' /> 
    <set value='133' /> 
    <set value='0' /> 
    <set value='0' /> 
    <set value='119' /> 
    <set value='0' /> 
    <set value='0' /> 
    </dataset> 
    <dataset seriesname='Write Object' color='' lineThickness='2'> 
    <set value='0' /> 
    <set value='0' /> 
    <set value='0' /> 
    <set value='0' /> 
    <set value='0' /> 
    <set value='11' /> 
    <set value='0' /> 
    </dataset> 
</graph> 
+0

好吧,我應該說這是我可以想象的最短解決方案之一... :)但是,再次,日期是一個日期,我真的不需要使用xml類型...我可以將整個內容存儲在一個字符串或def ..因爲我不知道圖表生成器需要一個XML輸入..只需要一個字符串.. – 2012-01-27 03:53:14

+0

可能到最後我只是將其轉換爲一個字符串? – 2012-01-27 03:54:29

+0

此外,你已硬編碼的系列列表..我需要它從主列表如果可能..可能是類似於def series = udbList.collect {it [2]} .unique() – 2012-01-27 04:01:01