2013-04-02 2 views
0

Если у меня есть мой GPATH так:Groovy «находка» закрытие ... обход через рекурсивный XML

<Apple> 
    <Mango> 
     <id>5 </id> 
    </Mango> 
    <Mango> 
     <id>10 </id> 
    </Mango> 
</Apple> 

Чтобы получить манго, который имеет идентификатор 5, я бы,

GPathResult result = Apple.find{ 
it.Mango.id=5 
} 

Но если мой GPath был рекурсивным. Я имею в виду, что у яблока может быть манго. И у манго снова может быть яблоко. Например:

<Apple> 
    <Mango> 
     <id>10</id> 
     <Apple> 
      <Mango> 
       <id>5 </id> 
      </Mango> 
     </Apple> 
    </Mango> 
</Apple> 

Как получить манго с идентификатором '5'. Однако рекурсивный, GPath может быть (Mango с идентификатором «5» может быть на любом уровне рекурсии), мне нужно найти для манго с идентификатором «5». Как я могу достичь этого с закрытием поиска?

Заранее спасибо

+0

Кажется, контратип http://stackoverflow.com/questions/6185746/ groovy-map-find-recursive, который имеет достаточно хороший ответ. –

+0

привет Билл, я отличный новичок..и не совсем понял ответ в этой теме. Можем ли мы сделать то же самое, не используя карту? – user1717230

+0

Вы должны уметь, конструкции должны быть одинаковыми, но я не выполнил эту работу, чтобы быть уверенным. Попробуйте - скопируйте код, заставьте его работать, как сначала, затем измените типы на то, что вы хотите, и посмотрите, сможете ли вы заставить его работать. Даже если это не помогает напрямую, оно должно научить вас достаточно, чтобы решить проблему самостоятельно. –

ответ

2

Вы можете использовать либо breadthFirst или depthFirst, в соответствии с тем, что лучше всего соответствует вашей структуре:

def xml = '''<Apple> 
    <Mango> 
     <id>10</id> 
     <Apple> 
      <Mango found="correct"> 
       <id>5</id> 
      </Mango> 
     </Apple> 
    </Mango> 
</Apple>''' 

nodes = new XmlParser().parseText xml 

mango = nodes.breadthFirst().find { it.id.text() == "5" } 

assert [email protected] == "correct" 

 Смежные вопросы

  • Нет связанных вопросов^_^