2017-11-01 5 views
1

ノードのインデックスを見つける方法でXMLを処理する良い方法を見つけることに問題があります。例:Groovy:ノードのインデックス

String test = ''' 
<Library> 
<Books> 
    <Book> 
    <Title>Hello</Title> 
    <Author>John Doe</Author> 
    <Publication>2008</Publication> 
    </Book> 
    <Book> 
    <Title>Bye</Title> 
    <Author>Mary Derp</Author> 
    <Publication>2011</Publication> 
    </Book> 
    [...] 
</Books> 
</Library>''' 

def xml = new XmlSlurper().parseText(test) 

タイトルが「Bye」で著者が「Mary Derp」である書籍があるかどうかを知りたいと思います。それが本当なら、ノードのインデックスを教えてください。したがって、この場合ノード[1]。

+0

どのような場合ですか? – Rao

+0

あなたはこれまでに何を試しましたか? –

答えて

1

マッチングブックのインデックスのリストが含まれます 'が見つかり':

String test = ''' 
<Library> 
<Books> 
    <Book> 
    <Title>Hello</Title> 
    <Author>John Doe</Author> 
    <Publication>2008</Publication> 
    </Book> 
    <Book> 
    <Title>Bye</Title> 
    <Author>Mary Derp</Author> 
    <Publication>2011</Publication> 
    </Book> 
    <Book> 
    <Title>Hello</Title> 
    <Author>Mary Derp</Author> 
    <Publication>2012</Publication> 
    </Book> 
    <Book> 
    <Title>Bye</Title> 
    <Author>Mary Derp</Author> 
    <Publication>2012</Publication> 
    </Book> 
</Books> 
</Library>''' 

def found = [] 
def Library = new XmlSlurper().parseText(test) 
Library.Books.Book.eachWithIndex { def book, int i -> 
    if (book.Title == 'Bye' && book.Author == 'Mary Derp') { 
     found += i 
    } 
} 
println found 

したがって、この場合には、それが返されます。 [1、3]

1

は、次のことを考えてみましょう。ブックをブーリアンに(collect経由で)マップし、最初にtrueの値を見つけます。 (を編集すると簡略化されます)

def Library = new XmlSlurper().parseText(test) 

def index = Library.Books.Book.collect { 
    (it.Title == 'Bye' && it.Author == 'Mary Derp') 
}.indexOf(true) 

assert 1 == index 
関連する問題