2013-04-17 3 views
3

Я хотел бы удалить узлы, которым не хватает определенного дочернего элемента.Как удалить узел, у которого отсутствует ребенок с Ruby и Nokogiri

Например, я хотел бы, чтобы удалить второй <release> узел здесь:

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

Я пробовал: doc.xpath("//Release[album='']").remove, но это явно не работает, потому что мне нужно найти узлы, где альбом не существуют, а не там, где они пусты.

Альтернативой мне было бы нужно вернуть что-то вроде «пустого» для любого узла, где альбом не был включен, когда я запускаю эту команду albums= doc.search('release/album').map{ |t| t.text}.

ответ

2

Вы бы:

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

ваш код не понял. –

+0

Хорошая стенография, понятия не имела о не. Очень полезно – mhenrixon

+0

Большое спасибо, очень просто. Еще один быстрый вопрос, если у вас есть момент, если я хочу проверить наличие нескольких дочерних элементов, мне нужно будет делать отдельные строки кода или есть опция, например 'doc.xpath ('// release [not (альбомный исполнитель)] «) .remove'? – user1596069

-1
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) 
+0

Использовать Nokogiri :: XML с данными xml. – pguardiario

+1

@pguardiario Это имеет значение? какие преимущества я должен иметь с этим? почему это неправильно? –

+0

ПОЧЕМУ вы не смотрите? – pguardiario