Groovy:查找其他节点中的节点

时间:2017-11-01 08:14:00

标签: java xml groovy jmeter xmlslurper

我遇到了一个问题,就是找到一种好的方法来处理xml,以便在其他节点之间找到一些节点。例如:

String test = '''
<Library>
 <Books>
  <Book>
    <Title>Hello</Title>
    <Author>John Doe</Author>
    <Publication>2008</Publication>
  </Book>
  <Book>
    <Title>Bye</Title>
    <Author>Mary Derp</Author>
    <Publication>2011</Publication>
  </Book>
  [...]
 </Books>
</Library>'''

def xml = new XmlSlurper().parseText(test)

现在我想知道是否有任何书的标题是“Bye”而作者是“Mary Derp”。首先想到的是find-method,但它会寻找“Bye”和“Mary Derp”的任何外观。

因此,例如,该方法应该寻找标题“Hello”和作者“Mary Derp”,它应该说是假的,因为没有这个标题和作者的书。

2 个答案:

答案 0 :(得分:0)

这就是它的方式:

import groovy.util.XmlSlurper

String input = '''
<Library>
 <Books>
  <Book>
    <Title>Hello</Title>
    <Author>John Doe</Author>
    <Publication>2008</Publication>
  </Book>
  <Book>
    <Title>Bye</Title>
    <Author>Mary Derp</Author>
    <Publication>2011</Publication>
  </Book>
  [...]
 </Books>
</Library>'''

def slurped = new XmlSlurper().parseText(input)
assert slurped.Books.Book.find { it.Title == 'Bye' && it.Author == 'Mary Derp' }.size() == 1
assert slurped.Books.Book.find { it.Title == 'Hello' && it.Author == 'Mary Derp' }.size() == 0

find查找搜索值的任何外观,但特定节点。

答案 1 :(得分:0)

您可以使用以下内容:

boolean isBookPresent(Object xml, String title, String author) {
    def myBook = xml.depthFirst().findAll { it.Title == title && it.Author == author}
    return myBook.size() > 0
}

演示:

JMeter Groovy Check XML Presence

但是,如果您的目标是在答案中没有标题为Bye Mary Derp //Book[Title='Bye' and Author='Mary Derp'] 的书籍的情况下使采样器失败,那么XPath断言的更简单方法就是:

  1. 将XPath Assertion添加为返回上述XML
  2. 的请求的子项
  3. 将以下表达式放入“XPath Assertion”区域:

    tabStyle

    JMeter XPath Assertion

    如果回复不包含您正在寻找的书籍 - JMeter会将采样器标记为失败

    JMeter xpath assertion demo

  4. 有关通过断言有条件地设置JMeter采样器结果的更多信息,请参阅How to Use JMeter Assertions in Three Easy Steps文章。