我有一个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]
谢谢
答案 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进行过滤以匹配节点名称。