Я пытался выполнить некоторую обработку для некоторых HTML фрагментов, при этом с Нокогири я столкнулся с проблемой, которую, похоже, не могу понять.
Я использую этот код:
doc = Nokogiri::HTML::fragment xml
doc.search("//text()[contains(.,'#{@wordbefore}')]").each do |node|
node.replace(node.content.gsub(/#{@wordbefore}/, ''))
end
С этим кодом весь блок пропускается. Тем не менее, если я использую:
doc = Nokogiri::XML xml
, это работает. Я пытался разобраться, почему это так, а что нет. Поскольку я действительно передаю фрагменты кода и не хочу, чтобы внутренние элементы кодировались, или пространство имен XML для каждого фрагмента, я действительно хотел бы сохранить это как фрагмент HTML ::. Но не могу определить, является ли это ошибкой, с которой я столкнулся или просто что-то делаю не так.
Обновление: вот все, что я настроил на своем тесте для начала. Еще одно примечание. Я понимаю, что это убьет то, что в элементе термина. На самом деле этой части нет, когда она запускается, так как она изменилась на другом этапе, но для меня это был самый простой способ получить реальный контент.
xml = <<-EOXML
<p dir="ltr" class="FM_Body">The Cortex-A5 MPCore processor is a high-performance, low-power, ARM macrocell with an L1 cache subsystem that provides full virtual memory capabilities. Up to four individual cores can be linked in a cache-coherent cluster, under the control of a <term>Snoop Control Unit</term> (SCU), that maintains L1 data cache coherency for memory marked as shared. The Cortex-A5 MPCore processor implements the ARMv7 architecture and runs 32-bit ARM instructions, 16-bit and 32-bit Thumb instructions, and 8-bit Java<tm tmtype="tm">Java</tm> bytecodes in Jazelle state.</p>
EOXML
doc = Nokogiri::XML xml
@wordbefore = "Java"
doc.search("//text()[contains(.,'#{@wordbefore}')]").each do |node|
node.replace(node.content.gsub(/#{@wordbefore}/, ''))
end
p doc.to_xml