2010-08-10 4 views
12

일부 태그가 다른 태그로 바뀌면 변환해야하는 HTML이 있습니다.Nokogiri로 전체 HTML 노드 찾기 및 바꾸기

나는이 태그에 대해 모른다. 왜냐하면 그들은 db에서 올거야. 따라서 Nokogiri의 set_attribute 또는 name 방법은 저에게 적합하지 않습니다.

나는이 의사 코드에 같은 방식으로 그것을 수행해야합니다

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

: 그것은 나를 위해 일을 does't

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

. 나는 "링크가 해제 된 노드에 문맥 상 파싱을하지 않는다"라는 오류를 생성합니다. "inner_html"속성이 설정된 라인의 경우이 방법으로 불평합니다. – AntonAL

+1

방금 ​​테스트를했으며 내 환경에서 작동합니다. 'new_node.inner_html ='을'new_node.content ='로 바꾸고 오류를 다시 확인하십시오. 그것해야합니다. –

+0

고마워, 알아 냈어. 문제는 DOM에 연결되지 않은 요소를 수정하는 것입니다. 먼저 교체하고 수정해야합니다. 좋은 점은 있지만 좀 더 혼란스러운 문제에 봉착했습니다. 대체품으로 마크 업을 삽입 할 수 없습니다. 예를 들어, "new_node.inner_html ="

Test
"라고하면 - 작동하지만 new_node.inner_html =" "이라고 말하면"undefined method' 자식과 충돌합니다. 'for nil : NilClass "... – AntonAL