2015-05-06 62 views
0

使用以下XML,任何人都可以告訴我在Groovy(Gpath或Xpath)中我如何在最左邊的元素上執行選擇,並且還包含返回正確父元素的引用?如何使用Groovy/GPath訪問父級XML元素

<CompoundEmployee> 
    <person> 
    <person_id_external>21554</person_id_external> 
    <employment_information> 
     <start_date>2014-02-27</start_date> 
     <job_information><end_date>2013-04-21</end_date><event>H</event><start_date>2012-09-28</start_date></job_information> 
     <job_information><end_date>2013-04-26</end_date><event>5</event><start_date>2013-04-22</start_date></job_information> 
     <job_information><end_date>9999-12-31</end_date><event>R</event><start_date>2014-02-27</start_date></job_information> 
    </employment_information> 
    </person> 
    <person> 
    <person_id_external>8265</person_id_external> 
    <employment_information> 
     <start_date>2000-10-02</start_date> 
     <job_information><end_date>2014-10-24</end_date><event>5</event><start_date>2014-05-22</start_date></job_information> 
     <job_information><end_date>2014-05-21</end_date><event>H</event><start_date>2000-10-02</start_date></job_information> 
     <job_information><end_date>9999-12-31</end_date><event>5</event><start_date>2014-10-25</start_date></job_information> 
    </employment_information> 
    </person> 
    <execution_timestamp>2015-05-05T08:17:51.000Z</execution_timestamp> 
    <version_id>1502P0</version_id> 
</CompoundEmployee> 

用英文寫的查詢語句是:

「開始招聘信息記錄的日期小於到工作信息開始日期和作業信息事件類型是租用的一個或重新聘用」

的查詢返回的元素必須包含employment_information中的person_id_external和job_information中的start_date。

到目前爲止,我已經試過.....

def xml = """ xml from above """ 
def list = new XmlSlurper().parseText(xml) 
x = list.'**'.findAll { person -> 
    person.event.text() in ['H','R'] && person.start_date.text() < list.person.employment_information.start_date.text() 
} 
x.each { l -> println "Type -> ${l.event}, Start Date -> ${l.start_date}, End Date -> ${l.end_date}" } 

當只有一個輸入文件的人,但在有多個員工的結果是不正確的,由於錯誤的「列表,它的偉大工程.person.employment_information.start_date「被引用,即父/子節點不相關。

基於該輸出的一個例子是以上:

類型 - > H,開始日期 - > 2012-09-28,結束日期 - > 2013年4月21日

類型 - > R,開始日期 - > 2014-02-27,結束日期 - > 9999-12-31

類型 - > H,開始日期 - > 2000-10-02,結束日期 - > 2014-05-21

實際上它應該只返回1行:

類型 - > H,開始日期 - > 2012-09-28,結束日期 - > 2013-04-21

正如你所看到的我幾乎在那裏,但我只是不能解決如何引用和返回邏輯上正確的家長employment_information記錄。

任何想法的人?

感謝, 格雷格

回答

0

查詢'**'和命名的變種有person是誤導性的,當你實際上是尋找就業的相關信息存在。這樣的事情:

def x = list.person.collectEntries{ person -> 
    [person.person_id_external.text(), person.employment_information.job_information.findAll{ ji -> 
     ji.event.text() in ['H','R'] && ji.start_date.text() < .person.employment_information.start_date.text()}} 
+0

謝謝@cfrick你的代碼工作的一種享受。有一個問題 - 所有的job_information元素都連接在一起,以滿足滿足findAll條件的元素。如果我使用'x.each {println'Key - > $ {it.key} Value - > $ {it.value}'}'來跟蹤它,我如何引用現在由它引用的job_information的各個元素。值?使用上述XML的一個例子是:'Key - > 21554 Value - > 2014-07-01R2014-02-272013-04-21H2012-09-28 Key - > 8265 Value - >' – Stokie