如何使用Groovy/GPath访问父XML元素

如何使用Groovy/GPath访问父XML元素,xml,groovy,gpath,Xml,Groovy,Gpath,使用下面的XML,有人能告诉我如何在Groovy Gpath或Xpath中对最左边的元素执行select并包含对正确父元素的引用吗 <CompoundEmployee> <person> <person_id_external>21554</person_id_external> <employment_information> <start_date>2014-02-27</start

使用下面的XML,有人能告诉我如何在Groovy Gpath或Xpath中对最左边的元素执行select并包含对正确父元素的引用吗

<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>
用英语编写的select语句是:

职务信息记录的开始日期小于雇用信息开始日期,职务信息事件类型为“雇用”或“重新雇用”之一

查询返回的元素必须包括就业信息中的人员id以及工作信息中的开始日期

到目前为止我已经试过

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}" }
当输入文件中只有一个人,但有多个员工时,由于引用了错误的list.person.employment\u information.start\u date(即父/子节点不相关),因此结果不正确,这一方法非常有效

基于上述内容,输出示例如下:

类型->H,开始日期->2012-09-28,结束日期->2013-04-21

类型->R,开始日期->2014-02-27,结束日期->9999-12-31

类型->H,开始日期->2000-10-02,结束日期->2014-05-21

实际上,它应该只返回一行:

类型->H,开始日期->2012-09-28,结束日期->2013-04-21

正如你所看到的,我就快到了,但我就是不知道如何引用并返回逻辑正确的家长就业信息记录

有什么想法吗

谢谢, Greg

当您实际在那里搜索就业信息时,查询“**”并将var命名为there 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()}}

谢谢@cfrick,你的代码非常有用。但有一个问题-所有作业信息元素都连接在一起,以获得满足findAll条件的元素。如果我用x.each{println Key->${it.Key}Value->${it.Value}}跟进这个问题,我如何引用现在由it.Value引用的作业信息的各个元素?使用上述XML的示例是:Key->21554 Value->2014-07-01R2014-02-272013-04-21H2012-09-28 Key->8265 Value->