Groovy Jmeter在列表中收集XML元素

时间:2018-10-16 18:53:33

标签: groovy

我有一个XML字符串,该字符串是通过HTTP的响应得到的

    <?xml version="1.0" encoding="utf-8"?>
<Specification xmlns="TestSpecification.xsd">
  <Cases>
    <Case>
        <Name>foo</Name>
        <Desc>foo1</Desc>
        <Begin>
          <ABC>0</ABC>
          <DEF>0</DEF>
        </Begin>
        <Perms>
            <TYPE1>
              <ABC>7</ABC>
              <DEF>8</DEF>
            </TYPE1>
            <TYPE2>
              <Perm>
                <PermNo>1</PermNo>
                <Description>Perm 1</Description>
                <ABC>5</ABC>
                <DEF>0</DEF>
                <GHI>1</GHI>
                <JKL>2</JKL>
              </Perm>
              <Perm>
                <PermNo>2</PermNo>
                <Description>Perm 1</Description>
                <ABC>5</ABC>
                <DEF>0</DEF>
                <GHI>1</GHI>
                <JKL>2</JKL>
              </Perm>
              <Perm>
                <PermNo>2</PermNo>
                <Description>Perm 1</Description>
                <ABC>5</ABC>
                <DEF>0</DEF>
                <GHI>3</GHI>
                <JKL>4</JKL>                
              </Perm>
            </TYPE2>          
        </Perms>    
    </Case>
  </Cases>
</Specification>        

我需要能够在一个列表中检索(ABC的DEF,GHI等)之间的所有元素。注意,Perms是可变的,可以是x个。

我已经通过获取开始和结束索引以及将每个块作为“详细信息”来获取数据而在循环中进行了尝试,但恐怕它可能很脆弱

ABC= (detail =~ "ABC>(.*)</ABC")[0][1]

谢谢

1 个答案:

答案 0 :(得分:1)

这将完成工作:

package test
/**
 * A simple application that parses a String that contains XML information using XmlSlurper.
 */
class Test {
    static stringXML = '''
  <Cases>
    <Case>
        <Name>foo</Name>
        <Desc>foo1</Desc>
        <Begin>
          <ABC>0</ABC>
          <DEF>0</DEF>
        </Begin>
        <Perms>
            <TYPE1>
              <ABC>7</ABC>
              <DEF>8</DEF>
            </TYPE1>
            <TYPE2>
              <Perm>
                <PermNo>1</PermNo>
                <Description>Perm 1</Description>
                <ABC>5</ABC>
                <DEF>0</DEF>
                <GHI>1</GHI>
                <JKL>2</JKL>
              </Perm>
              <Perm>
                <PermNo>2</PermNo>
                <Description>Perm 1</Description>
                <ABC>5</ABC>
                <DEF>0</DEF>
                <GHI>1</GHI>
                <JKL>2</JKL>
              </Perm>
              <Perm>
                <PermNo>2</PermNo>
                <Description>Perm 1</Description>
                <ABC>5</ABC>
                <DEF>0</DEF>
                <GHI>3</GHI>
                <JKL>4</JKL>
              </Perm>
            </TYPE2>
        </Perms>
    </Case>
  </Cases>
'''
   static main(args) {    
    def cases = new XmlSlurper().parseText(stringXML)
    def all = []
    ['ABC', 'DEF', 'GHI', 'JKL'].each{ tag ->
      def list = cases.depthFirst().findAll { it.name() == tag }
      println tag + ":" + list
      all += list
    }
    println all

    }
}

您设置标签列表,然后使用each遍历它们。 cases变量保存已解析的xml,并使用depthFirst首先获取要过滤的所有节点,然后使用findAll进行过滤以匹配节点名称。