1

Groovy と XmlSlurper を使用して HTTP URL を介して XML を解析し、タグに関連付けられた値を出力できます。以下は、生成されたサンプル XML ページです。

<worklog>
   <worklog_id>10100</worklog_id>
   <issue_key>TST-3</issue_key>
   <hours>2.0</hours>
   <work_date>2014-01-01</work_date>
   <work_date_time>2014-01-01 00:00:00</work_date_time>
   <username>admin</username>
   <reporter>admin</reporter>
</worklog>
<worklog>
   <worklog_id>10200</worklog_id>
   <issue_key>TST-3</issue_key>
   <work_date>2014-01-02</work_date>
   <work_date_time>2014-01-02 00:00:00</work_date_time>
   <username>admin</username>
   <reporter>admin</reporter>
</worklog>
<worklog>
   <worklog_id>10201</worklog_id>
   <issue_key>TST-3</issue_key>
   <hours>0.25</hours>
   <work_date>2014-01-02</work_date>
   <work_date_time>2014-01-02 10:33:00</work_date_time>
    <username>admin</username>
   <reporter>admin</reporter>
 </worklog>
<worklog>
   <worklog_id>10400</worklog_id>
   <issue_key>TST-3</issue_key>
   <hours>2.0</hours>
   <work_date>2014-01-07</work_date>
   <work_date_time>2014-01-07 12:03:00</work_date_time>
    <username>admin</username>
   <reporter>admin</reporter>
 </worklog>
<worklog>
   <worklog_id>10202</worklog_id>
   <issue_key>TST-4</issue_key>
   <hours>1.0</hours>
   <work_date>2014-01-02</work_date>
   <work_date_time>2014-01-02 15:52:00</work_date_time>
   <username>admin</username>
   <reporter>admin</reporter>
 </worklog>

ただし、私の XML では、XML をトラバースして、同じ値を持つ issue_key タグを探す必要があります。ここの「TST-3」のように、同じ値を持つ issue_key タグが複数ある場合、時間の work_date、work_date_time、username、activity_name、work_description、parent_key、reporter タグに関連付けられた値を、この 1 つの issue_key タグに対して収集して統合したいと考えています。そして、異なる issue_key 値を持つ他のタグとともに、生成されたのと同じ順序で出力します。

Groovy と XmlSlurper の完全な初心者で申し訳ありません。でも、どなたかやり方を教えていただけないでしょうか。また、以下は XML から属性を取得するための Groovy コードです。

def worklogList = new ArrayList<Worklog>()
    def wklog
    def worklogs = new XmlSlurper().parse(new File("C:\\xml-worklog\\worklog.xml"))
    worklogs.worklog.each {node ->
        wklog = new Worklog();

        wklog.work_date = node.work_date
        wklog.work_date_time = node.work_date_time
        wklog.issue_key = node.issue_key
        wklog.hours = node.hours
        wklog.username = node.username
        wklog.reporter = node.reporter
        worklogList.add(wklog)
    }
    worklogList.each {wklogT -> println(wklogT)}
}

class Worklog
{
String issue_key
String hours
String work_date
String work_date_time
String username
String activity_name
String work_descripton
String reporter

    @Override
    public String toString()
    {
        return "Issue Key: ${issue_key} \t Hours: ${hours} \t Work Date: ${work_date} \t Work Date Time: ${work_date_time} \t Username: ${username} \t Reporter: ${reporter} \t Activity Name: ${activity_name} \t Description: ${work_descripton}"
    }
}

そして、特定の課題キーの予想される o/p を、 「TST-3」としましょう-


労働時間 | 勤務日 | 勤務日時 | ユーザー名 | レポーター |


2.0 | 2014-01-01 | 2014-01-01 00:00:00 | 管理者 | 管理者 |


| 2014-01-02 | 2014-01-02 00:00:00 | admin | admin |

0.25| 2014-01-02 | 2014-01-02 10:33:00 | 管理者 | 管理者 |


2.0 | 2014-01-07 | 2014-01-02 12:03:00 | 管理者 | 管理者 |


すべての issue_key 属性の順序付きリスト オブジェクトでこれらの値を取得するにはどうすればよいですか。

4

3 に答える 3

3

問題を解決するための迅速かつ中継可能な方法として、Worklog課題キーによって初期化されたインスタンスを提供するファクトリ メソッドを作成することをお勧めします。

その場合、わずかな変更を加えて、同じように xml を処理できます。以下は、作業ログを処理するためのコードのドラフトです。

def worklogs = [:]
def createWorklog(String id) {
   if (!worklogs.containsKey(id))
     worklogs[id] = new Worklog()
   return worklogs[id]
}

worklogs.worklog.each {node ->
    wklog = createWorklog(node.issue_key); // creates, or give created, and save it to list.

    // It don't know, what do you want to do with different dates or usernames.
    // If you want, you can have a list of them, and add value to list here, or consolidate whole change structures to list.
    wklog.hours += node.hours // aggregate hours.
}
于 2014-02-10T07:16:01.140 に答える