web-dev-qa-db-ja.com

GroovyのXmlSlurperで要素の存在を確認するにはどうすればよいですか?

GroovyのXmlSlurperでXML要素が存在するかどうかを判断しようとしています。これを行う方法はありますか?例えば:

<foo>
  <bar/>
</foo>

バー要素が存在するかどうかを確認するにはどうすればよいですか?

32
Josh Brown

APIは少し厄介ですが、子供を探すためのより良い方法がいくつかあると思います。 「xml.bar」(存在する)または「xml.quux」を要求したときに得られるのは、 groovy.util.slurpersupport.NodeChildren オブジェクトです。基本的に、要求した基準を満たすノードのコレクション。

特定のノードが存在するかどうかを確認する1つの方法は、NodeChildrenのサイズが予想されるサイズであることを確認することです。

def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert 1 == xml.bar.size()
assert 0 == xml.quux.size()

もう1つの方法は、findメソッドを使用して、返されるノードの名前(残念ながら、常に何かが返される)が、期待していたものであるかどうかを確認することです。

def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert ("bar" == xml.children().find( {it.name() == "bar"})?.name())
assert ("quux" != xml.children().find( {it.name() == "quux"})?.name())
37
Ted Naleid

GPathResultのisEmptyメソッドは機能します。

def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert false == xml.bar.isEmpty()

バー要素is empty-には本体がないため、これは気になります。しかし、GPathResultは空ではないと思うので、おそらくこれは理にかなっています。

17
Josh Brown