GroovyのXmlSlurperでXML要素が存在するかどうかを判断しようとしています。これを行う方法はありますか?例えば:
<foo>
<bar/>
</foo>
バー要素が存在するかどうかを確認するにはどうすればよいですか?
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())
GPathResultのisEmptyメソッドは機能します。
def text = "<foo><bar/></foo>"
def xml = new XmlSlurper().parseText(text)
assert false == xml.bar.isEmpty()
バー要素is empty-には本体がないため、これは気になります。しかし、GPathResultは空ではないと思うので、おそらくこれは理にかなっています。