当前位置: 首页 > 知识库问答 >
问题:

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

黎震博
2023-03-14

使用下面的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语句是:

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

当输入文件中只有一个人时,这种方法很有效,但当有多个雇员时,由于引用了错误的“list.person.employment_information.start_date”,即父/子节点不相关,结果就不正确。

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

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

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

共有1个答案

单昊穹
2023-03-14

查询'**'并在那里命名varperson是误导性的,当您实际在那里搜索就业信息时。类似于这样:

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()}}
 类似资料:
  • 我有一些元素具有相同的标记名,但相等的不同值。下面的示例显示了我的解析。 我的问题是如何捕获字符串“x”后面的文本。和“Z”目前我有 但这只是抓取x和Z。我需要什么语法来抓取之后的文本,其中包括Monday和Linux。

  • 问题内容: 我有一个XML文档,内容如下: 我的问题是如何使用Python中的BeautifulSoup这样的库访问它们? xmlDom.web [“ Web”]。总计?不起作用? 问题答案: BeautifulSoup本身不是DOM库(它不实现DOM API)。使事情变得更复杂的是,您在该xml片段中使用了名称空间。要解析该特定的XML片段,可以使用BeautifulSoup,如下所示: 如果您

  • shadowdom结构:在上面的shadowdom结构中,我们可以在chrome中使用selenium和javascript访问各个元素,如下所示: 在Firefox中://div[@class='Style-Sconk-tabs'而不是(@隐藏)]//div/span[包含(text(),'AttrName')]/.../前驱兄弟姐妹::div/puch-icon-按钮[1]/铁图标[1] 在C

  • 问题内容: 我有一个网页,其中iframe内有一个texarea。我需要从其子页面javascript读取此textarea的值。目前,通过在javascript中使用,我能够提取父页面中除iframe中的textarea之外的所有控件的值。 父页面中的框架ID和框架名称在运行时会更改,因此我们无法使用框架ID /框架名称作为参考。 问题答案: 如果您有HTML 和JavaScript 现在是对文

  • 问题内容: 我搞砸了SVG,希望能在Illustrator中创建SVG文件并使用Javascript访问元素。 这是Illustrator推出的SVG文件(它似乎也向我删除的文件的开头添加了一些垃圾) 正如您可能看到的那样,每个元素都有一个ID,我希望能够使用Javascript访问单个元素,以便我可以更改Fill属性并响应诸如click之类的事件。 HTML是基本的 我想这真的是两个问题。 与使

  • 问题内容: 我有一个iframe,为了访问父元素,我实现了以下代码: 如何使用jQuery获得相同的结果? 更新 :或如何使用jquery访问iFrame父页面? 问题答案: 要在iFrame的父项中查找,请使用: $()包装器的第二个参数是要在其中搜索的上下文。默认为文档。