2016-11-15 1 views
0

У меня есть узел, который содержит текст 'The f':Как получить первый узел до текущего узла, который содержит текст с помощью Nokogiri?

<w:r w:rsidR="00BC78BF"> 
    <w:t>e takes out his phone and calls a friend.</w:t> 
</w:r> 
<w:r w:rsidR="00CB49B6"> 
    <w:t xml:space="preserve"/> 
</w:r> 
<w:ins w:author="Mitchell Gould" w:date="2016-11-14T14:23:00Z" w:id="8"> 
    <w:r w:rsidR="00BC7F15"> 
    <w:t>The f</w:t> 
    </w:r> 
</w:ins> 

Я хочу, чтобы получить первое вхождение текста, который существует до этого текстового узла.

Я попытался с помощью:

node.previous_element.text 
=> " " 

и

previous_node = node.xpath('preceding-sibling::w:r').last 
=> " " 

Это потому, что иногда previous_element просто пространство, как показано выше, и вполне возможно, что там может быть много из этих элементов, просто пробелы.

Как я могу получить первый предшествующий родной брат, содержащий текст?

+0

Что вы ожидаете получить? «Вынимает телефон и звонит другу». Что вы пробовали в коде? – mudasobwa

+0

Я обновил свой вопрос, чтобы показать, что я пробовал. Да, я хотел бы получить «e», вытаскивает свой телефон и вызывает друга ». – chell

+0

Получите коллекцию узлов' w: t' и переместите ее на один шаг назад, чтобы получить _previous элемент 'w: t'. рекурсивный 'previous_element', если это свойство' text' не пусто. – mudasobwa

ответ

0

Я хотел бы начать с:

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<xml> 
    <r> 
    <t>e takes out his phone and calls a friend.</t> 
    </r> 
    <r> 
    <t/> 
    </r> 
    <ins> 
    <r> 
     <t>The f</t> 
    </r> 
    </ins> 
</xml> 
EOT 

doc.search('//text()').map { |t| t.text.strip }.reject(&:empty?) 
# => ["e takes out his phone and calls a friend.", "The f"] 

Тогда становится вопрос идентификации элемента перед "The f", который я оставил в качестве задачи для вас. Это не сложно, но в большом документе может определенно повлиять на производительность кода.

//text() - это способ XPath найти все текстовые узлы в документе. // означает «поиск сверху вниз» в основном. Текстовым узлом являются не только такие вещи, как «The f», но и новая строка после закрывающего тега в довольно печатном XML-файле.

text.strip, за которым следует reject, выполняется для удаления любого форматирования XML между узлами, пробелами и пустыми строками.

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