查找XML节点相对于匹配另一个节点值的值
我有以下XML文件:查找XML节点相对于匹配另一个节点值的值,xml,groovy,Xml,Groovy,我有以下XML文件: <0> <title>The Little Hours</title> <year>2017</year> <imdbid>tt5666304</imdbid> <scid>10080</scid> </0> <1> <title>CarGo</title>
<0>
<title>The Little Hours</title>
<year>2017</year>
<imdbid>tt5666304</imdbid>
<scid>10080</scid>
</0>
<1>
<title>CarGo</title>
<year>2017</year>
<imdbid>tt6680792</imdbid>
<scid>10079</scid>
</1>
<2>
<title>My Little Pony: The Movie</title>
<year>2017</year>
<imdbid>tt4131800</imdbid>
<scid>10078</scid>
</2>
<3>
<title>Amityville: The Awakening</title>
<year>2017</year>
<imdbid>tt1935897</imdbid>
<scid>10077</scid>
</3>
<4>
<title>6 Days</title>
<year>2017</year>
<imdbid>tt4703048</imdbid>
<scid>10076</scid>
</4>
fn为10076
这仅返回所有4个节点的标题。使用
的值,我如何才能找到
标记的值?除了小错误之外,您几乎就在那里了@
用于访问xml元素或节点的属性
;其中as元素可以直接访问.elementName
,如下所示:
使用以下方法可以实现相同的效果:
def fn = '10076'
def xml = new XmlSlurper().parse('/file/path/to.xml')
//Use findAll if you are expecting multiple titles; this returns a list of all titles matching scid is 10076
println xml.'**'.findAll { it.name() == 'scid' && it.text() == fn}*.parent()*.title*.text()
如果您希望scid
元素值始终是唯一的,则不需要使用findAll
;而是使用find
方法;所以你总是得到一个标题
,而不是像上面那样的结果
println xml.'**'.find { it.name() == 'scid' && it.text() == fn}.parent().title.text()
您可以在线快速试用。请检查解决方案,看看是否有帮助。@Dade,没问题。如果这是有帮助的,感谢向上投票&。嘿,对不起,我不得不删除我的评论,因为我不知道它会通过输入按钮提交。我将用我现在的评论补充另一条评论。我直到现在才有时间尝试,所以我的问题是,我的XML文件非常大,超过47000行。因此,我要做的是使用
defxml=newxmlslurper().parse('/file/path/to.xml')
读取xml文件。然后我使用您的代码println xml.'**'。查找{it.name()=='scid'&&it.text()==fn}.parent().title.text()
,以显示标题。但是,有一个错误/警告是这样说的:表达式产生空值实体名称必须紧跟实体引用中的“&”
如果有帮助的话,我正在尝试在名为FileBot的软件中使用这段代码。我正在尝试使用重命名多个文件FileBot@Dade,我首先要求您至少尝试一下演示,看看它对您在问题中提供的示例xml是如何工作的。
println xml.'**'.find { it.name() == 'scid' && it.text() == fn}.parent().title.text()