2012-02-25 4 views
1

У меня есть это:Удалить элементы из XML, содержимое Совпадение любого из нескольких слов

string1 = "<det>This</det> <vbz>is</vbz> <det>a</det> <nn>text</nn> <in>that</in> <vbz>has</vbz> <det>some</det> <vbn>desired</vbn> <nn>text</nn> <to>to</to> <vb>be</vb> <vbn>found</vbn>" 
substring = "desired text" 

мне нужно, чтобы получить что-то вроде:

ary = [ 
    "<det>This</det>", "<vbz>is</vbz>", "<det>a</det>", "<in>that</in>", 
    "<vbz>has</vbz>", "<det>some</det>", "<to>to</to>", "<vb>be</vb>", 
    "<vbn>found</vbn>" 
] 

Я знаю, что я могу сделать это с некоторым регулярным выражением и массивы/хэши и вложенные петли.
Интересно, хотя, если я смогу использовать Nokogiri, чтобы каким-то образом внести какую-то элегантность в этот процесс?

+0

Итак, вы хотите * удалить * элементы из xml, если они соответствуют любому термину из подстроки? –

ответ

3

Что у вас есть фрагмент XML-документ, так что вы можете использовать Nokogiri на него так:

require "nokogiri" 
doc = Nokogiri::XML::DocumentFragment.parse(string1) 

Чтобы получить список всех элементов, которые делают не матча слова из вашей подстроки, сделайте следующее:

words = substring.split 
doc.xpath('*').reject {|e| words.include? e.text}.map(&:to_s) 

#=> ["<det>This</det>", "<vbz>is</vbz>", "<det>a</det>", "<in>that</in>", "<vbz>has</vbz>", "<det>some</det>", "<to>to</to>", "<vb>be</vb>", "<vbn>found</vbn>"] 

Это соответствует выводу, который вы хотите.

+0

спасибо, это работает! – Stpn

+0

Обратите внимание, что если вы просто хотите сами слова, замените 'map (&: text)' на 'map (&: to_s)'. –

+0

спасибо! – Stpn

0

Вы можете использовать команду split, которая составляет built into Ruby's String class. Вы можете использовать его так:

string1 = "<det>This</det> <vbz>is</vbz> <det>a</det> <nn>text</nn> <in>that</in> <vbz>has</vbz> <det>some</det> <vbn>desired</vbn> <nn>text</nn> <to>to</to> <vb>be</vb> <vbn>found</vbn>" 
ary = string1.split 

Затем вы можете цикл через массив с классом массива map function. Я не уверен, что именно вы пытаетесь сделать? Получить индекс значения в массиве? Если это так, вы можете использовать класс массива index method так:

ary.index(substring) 
+0

подстрока не имеет тегов, которые будут содержать элементы ary в этом случае - подстрока представляет собой текст без тегов <>. – Stpn

Смежные вопросы