2012-01-27 2 views
0

こんにちは、私はこのうちのグラフを生成dataXMLを作成しています。このグラフデータを生成するために、ネストされたリストを処理

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] 
      ] 

のようなリスト構造のリストを持っています。 グラフの種類はマルチです - 私はudbListを持ってこの

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) 
} 

ような行各行は、イベントの略日付別グラフ(読み取り/書き込み/保存リスト - の最後の値)

何か人口、どのように私はだから私は、NEこの

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> 

のようなdataXMLを持つ必要があります上記のサンプルリストについては、最終的にはdataXML

を形成するためのロジックを記述します日付に特定のイベントタイプの結果がない場合リストのリストからこの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は、この1つは日付を取ることです複数のイベントタイプを考慮します。

+0

私が持っている1つの小さな問題は、私のキャプションです、いくつかの他の属性が取得/どこかで私はxml.graph(キャプション: '"+ mycaption +"'、lineThickness: '3'、rotateNames : '1')def mcaption = 'user dashboard' –

+0

@pri_dev 'mycaption'が変数の場合は、' xml.graph(caption: "\" + $ mycaption + \ ""、lineThickness : '3'、rotateNames: '1') '。 'mycaption ==" Something "ならば、あなたは' '' – epidemian

+0

ok ..これは私がXMLと思うはずです。グラフ(キャプション:myCaption、subCaption:....) –

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

私は、私が想像することができる最短の解決策の1つを言うべきです:)しかし、再び、日付は日付であり、私は本当にXML型を使用する必要はありません...私はちょうど文字列またはdef ..私はチャートジェネレータがXML入力を取るかどうか分からない..文字列を取るだけ.. –

+0

私はちょうど文字列に変換することがありますか? –

+0

また、あなたはシリーズリストをハードコードしています。可能ならばメインリストから必要です。def series = udbList.collect {it [2]} .unique() –

関連する問題