2014-02-10 2 views
1

Groovy 및 XmlSlurper를 사용하여 HTTP URL을 통해 XML을 구문 분석하고 태그와 관련된 값을 출력 할 수 있습니다. 아래는 생성 된 샘플 XML 페이지입니다.Groovy 및 XmlSlurper를 사용하여 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,이 단일 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 특성에 대해 정렬 된 목록 개체에서 어떻게 얻을 수 있습니까?

답변

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. 
} 
+0

감사합니다. 나는 그루비 스크립팅으로 어떻게 돌아갈 수 있는지에 대해 완전히 비어 있습니다. 비슷한 issue_key 속성을 가진 세부 작업 로그 노드를 저장하는 방법은 ** TST-3 **을 정렬 된 순서로 하나의 목록에 저장하는 것입니다. 즉, 문제에 대해 작업 로그를 입력하는 순서와 다른 목록에 다른 작업 로그 노드를 입력하는 순서입니다 . 좀 더 밝혀 주실 수 있습니까? – Naren

1

또는 당신은 Worklog 인스턴스 추가 할 plus 방법을 정의 할 수 있습니다 :

@groovy.transform.Canonical 
@groovy.transform.ToString 
class Worklog 
{ 
    String issue_key 
    Double hours 
    String work_date 
    String work_date_time 
    String username 
    String activity_name 
    String work_description 
    String reporter 

    Worklog plus(Worklog w) { 
     new Worklog(issue_key, 
        hours + w.hours, 
        work_date, 
        work_date_time, 
        username, 
        activity_name, 
        work_description, 
        reporter) 
    } 
} 

을 그리고 XML을 구문 분석, 그룹 단일 항목으로 issue_key에 의한 항목과 그룹을 추가

def log = new XmlSlurper().parse(xmlFile) 
          .worklog 
          .collect { w -> 
           new Worklog(w.issue_key.text(), 
              w.hours.text() ? w.hours.text().toDouble() : 0, 
              w.work_date.text(), 
              w.work_date_time.text(), 
              w.username.text(), 
              w.activity_name.text(), 
              w.work_description.text(), 
              w.reporter.text()) 
          } 
          .groupBy { it.issue_key } 
          .values()*.inject { a, b -> a + b } 
+0

감사합니다. Tim. 동일한 issue_key 속성 값을 갖는 작업 로그 노드를 몇 시간 추가하고 싶지 않습니다. 이 작업 로그 노드를 하나의 컬렉션에 저장하려고합니다. – Naren

0

soapui에서 아래에서 시도한 새로운 groovy 단계를 만들고 코드 아래에

을 추가했습니다.

짧은 버전 :.

DEF publishbooks = 새로운 XmlSlurper() ('http://xyz:8003/myflow/api/books?expanded=true')을 파싱 publishbooks.publishJob log.info

[0]을

.jobName

세부 버전 :

//Written by Raja. 
// This code will parse the uri - http://xyz:8003/flow/api/jobs?expanded=true 
// and iterate through publishJob nodes and gets the jobid relavant to jobname we added. 

def publishJobs = new XmlSlurper().parse('http://xyz:8003/flow/api/jobs?expanded=true') 
String TSjobname = testRunner.testCase.testSuite.getPropertyValue('jobname') 

publishJobs.publishJob.findAll 

{ it.jobName == TSjobname }.each { 
     String id = [email protected] 
     testRunner.testCase.testSuite.setPropertyValue("jobid", id ) 
log.info id; 
} 
URI의 내부3210

XML 컨텐츠 - http://xyz:8003/myflow/api/books?expanded=true

<PublishJobs> 
    <publishJob id="248" xlink:href="http://xyz:8003/myflow/api/books/248"> 
     <completedTasksCount>196</completedTasksCount> 
     <tasksCount>196</tasksCount> 
     <generateArchive>false</generateArchive> 
     <jobName>11111</jobName> 
     <priority>10</priority> 
     <status>FINISHED</status> 
    </publishJob> 
    <publishJob id="250" xlink:href="http://xyz:8003/myflow/api/books/250"> 
     <completedTasksCount>51</completedTasksCount> 
     <tasksCount>51</tasksCount> 
     <generateArchive>false</generateArchive> 
     <jobName>44444</jobName> 
     <priority>10</priority> 
     <status>FINISHED</status> 
    </publishJob> 
</PublishJobs>