我有一个方法需要搜索xml文件,该文件使用XmlParser按名称解析元素,并仅在该元素是结束节点时返回它。例如:
class xmlTest extends GroovyTestCase {
def void test(){
def xmlBody = """
<rootElement>
<elementWithOneChild>
<endElement>Here is the end</endElement>
</elementWithOneChild>
<elementWithManyChildren>
<one>1</one>
<two>1</two>
<three>1</three>
</elementWithManyChildren>
</rootElement>"""
def parsedBody = new XmlParser().parseText(xmlBody)
def search1 = parsedBody.depthFirst().grep({it.name() == "elementWithOneChild"})
println search1[0].children().size()
def search2 = parsedBody.depthFirst().grep({it.name() == "endElement"})
println search2[0].children().size()
def search3 = parsedBody.depthFirst().grep({it.name() == "elementWithManyChildren"})
println search3[0].children().size()
}
}
我尝试使用Node.children()。size()的工作原理除外,其中1到1的情况下元素包含一个子元素。在这种情况下,search1.children()。size()和search2.children()。size()都返回1.虽然,elementWithManyChildren的大小是3.我正在寻找一种能够告诉终端节点的方法除了有一个孩子的元素。
我发现的一种方法是:
try{
search1[0].children().iterator().next().name()
}catch(e){
//If the next node does not have a name, it is an end node
}
但这个解决方案似乎很差。
答案 0 :(得分:0)
可能会浪费几个周期,但这应该可以让你找到终端节点
assert search1[0].'**'.size() == 2
assert search2[0].'**'.size() == 1
assert search3[0].'**'.size() == 4