groovy 如何使用GPathResult获取下一个兄弟节点

ghhkc1vu  于 8个月前  发布在  其他
关注(0)|答案(2)|浏览(89)

如何获取GPathResult的下一个兄弟节点?例如,我有以下代码:

def priorityIssue = xmlReport.'**'.find { Issue ->
   Issue.Priority.text() == priority
}

如何获取priorityIssue的下一个兄弟节点?
谢谢你,谢谢

2w2cym1i

2w2cym1i1#

或多或少,这是一条路要走:

import groovy.util.XmlSlurper

def xml = new XmlSlurper().parseText('''
<issues>
    <issue>
        <id>1</id>
        <priority>1</priority>
    </issue>
    <issue>
        <id>2</id>
        <priority>2</priority>
    </issue>
</issues>
''')
def p = '1' 
def priorityIssue = xml.'**'.find { issue ->
    issue.priority.text() == p
}
def kids = priorityIssue.parent().children().list()
def idx = kids.indexOf(priorityIssue)
def sibling = kids[++idx]
assert sibling.id.text() == '2'
w41d8nur

w41d8nur2#

indexOf()的解决方案仅在搜索具有唯一文本内容的节点时有效。问题是,NodeChild示例总是由text()进行比较,参见GPathResult#hashCode()。我必须到达实际的节点,而不是它们的代理NodeChild

xml = new groovy.util.XmlSlurper().parseText('''\
<issues>
  <issue>
    <first/>
    <priority>1</priority>
  </issue>
  <issue>   
    <second/>
    <priority>2</priority>
  </issue>
  <issue>   
    <third/>
    <priority>1</priority>
  </issue>  
</issues>
''')

third = xml.'**'.find{it.name() == 'third'}
thirdIssue = third.parent()
issues = thirdIssue.parent().children()
println 'wrong: ' + issues.list().indexOf(thirdIssue)
println 'right: ' + issues.findIndexOf{it[0] == thirdIssue[0]}

额外小费:您也可以使用Integer.toHexString(System.identityHashCode(issue))来检查您正在处理的示例。

相关问题