2010-08-10 1 views
12

У меня есть HTML, который должен быть преобразован, если некоторые теги заменены на другие теги.Найти и заменить целые HTML-узлы на Nokogiri

Я не знаю об этих тегах, потому что они будут происходить из db. Итак, set_attribute или name методы Nokogiri мне не подходят.

мне нужно сделать это, в некотором смысле, как в этом псевдокоде:

def preprocess_content 
    doc = Nokogiri::HTML(self.content) 
    doc.css("div.to-replace").each do |div| 
    # "get_html_text" will obtain HTML from db. It can be anything, even another tags, tag groups etc. 
    div.replace self.get_html_text 
    end 
    self.content = doc.css("body").first.inner_html 
end 

Я нашел Nokogiri::XML::Node::replace метод. Я думаю, это правильное направление.

Этот метод ожидает некоторый параметр node_or_tags.

Какой метод я должен использовать для создания нового узла из текста и замены его на него?

ответ

22

Как что:

doc.css("div.to-replace").each do |div| 
    new_node = doc.create_element "span" 
    new_node.inner_html = self.get_html_text 
    div.replace new_node 
end 
+0

Это does't работает для меня. Я генерирую ошибку: «нет контекстного анализа на несвязанных узлах». Он жалуется таким образом на строку, где свойство «inner_html» установлено – AntonAL

+1

Я только что протестировал, и он работает в моей среде. Попробуйте заменить 'new_node.inner_html =' на 'new_node.content =' и дважды проверьте наличие ошибок. Должно. –

+0

Спасибо, я понял это. Проблема заключалась в том, что в DOM был изменен еще несвязанный элемент. Сначала мы должны заменить, а затем изменить. Это хорошо, но я столкнулся с более запутанной проблемой - никакая разметка не может быть вставлена ​​в качестве замены. Например, когда я говорю «new_node.inner_html =»

Test
«- он работает, но когда я говорю new_node.inner_html =«

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

  • Нет связанных вопросов^_^