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

时间:2015-05-06 08:02:58

标签: 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_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语句是:

&#34;工作信息记录的开始日期小于员工信息开始日期和工作信息事件类型是雇用或重新雇佣的一个&#34;

查询返回的元素必须包含jobs_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}" }

当输入文件中只有一个人但是当有多个员工时,由于错误的&#34; list.person.employment_information.start_date&#34;被引用,即父/子节点不相关。

基于以上输出的一个例子是:

类型 - &gt; H,开始日期 - &gt; 2012-09-28,结束日期 - &gt; 2013年4月21日

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

类型 - &gt; H,开始日期 - &gt; 2000-10-02,结束日期 - &gt; 2014年5月21日

实际上它应该只返回1行:

类型 - &gt; H,开始日期 - &gt; 2012-09-28,结束日期 - &gt; 2013年4月21日

正如您所看到的那样,我几乎就在那里,但我无法确定如何参考并返回逻辑上正确的父就业信息记录。

任何想法?

谢谢, 格雷格

1 个答案:

答案 0 :(得分: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()}}