确定从使用XmlParser解析的文件中的结束节点

时间:2011-04-27 00:45:42

标签: groovy xml-parsing

我有一个方法需要搜索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
}

但这个解决方案似乎很差。

1 个答案:

答案 0 :(得分:0)

可能会浪费几个周期,但这应该可以让你找到终端节点

assert search1[0].'**'.size() == 2
assert search2[0].'**'.size() == 1
assert search3[0].'**'.size() == 4