2015-05-06 3 views
0

Использование следующего XML-кода может рассказать мне, как в Groovy (Gpath или Xpath) я выполняю выбор в самом левом элементе, а также ссылаюсь на верный родительский элемент?Как получить доступ к родительским элементам XML с использованием Groovy/GPath

<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> 

ЗЕЬЕСТ написано на английском языке:

«Дата начала работы информационной записи меньше Принятие на работу данных Дата начала И Job Information тип события является одним из Hire или нанять»

элементы, возвращаемые запросом, должны включать person_id_external из job_information вместе с start_date из job_information.

До сих пор я пытался .....

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-04-21

Тип -> R, Дата начала -> 2014-02-27, Дата окончания -> 9999-12-31

Тип -> H, Дата начала -> 2000-10-02, Дата окончания -> 2014-05-21

, где на самом деле он должен возвращать только 1 ряд:

Тип -> H, Дата начала -> 2012-09-28, Дата окончания -> 2013-04-21

Как вы можете видеть, я почти там, но я просто не могу разобраться, как ссылаться и возвращаться логически правильная запись о родительской занятости.

Любые идеи кто-нибудь?

Спасибо, Грег

ответ

0

'**' Запрашивание и называя вар там person вводит в заблуждение, когда вы на самом деле ищет Infos занятости там. Что-то вроде этого:

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: «Ключ -> 21554 Значение -> 2014-07-01R2014-02-272013-04-21H2012-09-28 Ключ -> 8265 Значение ->' – Stokie