如何使用Ruby和Nokogiri删除缺少子节点的节点

如何使用Ruby和Nokogiri删除缺少子节点的节点,ruby,nokogiri,nodes,Ruby,Nokogiri,Nodes,我想删除缺少特定子节点的节点 例如,我想在这里删除第二个节点: <release> <artist>Johnny Cash</artist> <album>Live from Folsom Prison</album> </release> <release> <artist>Johnny Cash</artist> </release> 约翰尼·卡什 住在福尔松监狱

我想删除缺少特定子节点的节点

例如,我想在这里删除第二个
节点:

<release>
 <artist>Johnny Cash</artist>
 <album>Live from Folsom Prison</album>
</release>
<release>
 <artist>Johnny Cash</artist>
</release>

约翰尼·卡什
住在福尔松监狱
约翰尼·卡什
我已经尝试过:
doc.xpath(“//Release[album=”)。删除
,但这显然不起作用,因为我需要找到album不存在的节点,而不是空的节点

我需要的另一种选择是,当我运行这个命令
albums=doc.search('release/album').map{t|t.text}
时,为任何不包含相册的节点返回类似“empty”的内容

您可以这样做:

doc.xpath('//release[not(album)]').remove


很好的速记,我不知道。非常有用非常感谢,非常简单。如果您有时间的话,还有一个快速问题,如果我想检查多个子项,我是否需要执行单独的代码行,或者是否有类似于
doc.xpath('//release[not(album-artist)]的选项。删除
?应该是:
//release[not(album)或not(artist)]
您可以使用
将Nokogiri::XML与XML数据一起使用。@pguardiario这有关系吗?这样做有什么好处?为什么不正确?@pguardiario是的,我做了。但改进建议是好的,但不是否决一个有效的建议。至少我同意这一点。
doc = Nokogiri::HTML::DocumentFragment.parse(html)
node_set = doc.search('release')
del_node = node_set.select { |n| n.last_element_child.name != 'album'}.first
node_set.delete(del_node)
doc = Nokogiri::HTML(html)
doc.xpath('//release').delete(doc.xpath('//release').last)