Определение конечного узла из файла, проанализированного с помощью XmlParser - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть метод, который должен искать 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 голосов
/ 27 апреля 2011

может потратить пару циклов, но это должно позволить вам найти терминальные узлы

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