2009-06-04 5 views
1

같이 좀 XHTML이 (그러나 정말 어떤 XML 할 것) :Ruby에서 XML 태그를 구문 분석 할 때 모든 컨텐츠의 합계를 얻으려면 어떻게해야합니까?

<h1> 
    Hello<span class='punctuation'>,</span> 
    <span class='noun'>World<span class='punctuation'>!</span> 
</h1> 

가 어떻게 루비의 String로서 <h1/>의 전체 내용을받을 수 있나요?

assert_equal "Hello, World!", h1_node.some_method_that_aggregates_all_content 

는 XML 프레임 워크 중 하나를 수행합니다 (Nokogiri, libxml-ruby, & 다.) 것은 내장의 종류가 : 같이? 그렇지 않다면, 나는 Y-Combinator가 그 일에 적합한 도구 일지 모른다고 생각하지만, 어떻게 생겼는지 알 수는 없다.

답변

3

Nokogiri를 사용하면 노드의 text을 요청할 수 있습니다. 내가 그 일을 할 때 볼 수있는 문제는 그 노드에있는 모든 공백과 개행 문자가 반환된다는 것입니다. 그래서 여러분은 그 노드를 제거 할 수 있습니다 (이 예제에서했던 것보다 더 나은 방법). 여기

는 샘플입니다

def test_nokogiri_text 
    value = Nokogiri::HTML.parse(<<-HTML_END) 
    "<h1> 
     Hello<span class='punctuation'>,</span> 
     <span class='noun'>World<span class='punctuation'>!</span> 
    </h1>" 
    HTML_END 

    h1_node = value.search("h1").first 
    assert_equal("Hello, World!", h1_node.text.split(/\s+/).join(' ').strip) 
end 
+0

그 (것)들을 동등 물로 취급하면 h1_note.text.gsub (/ \ s + /, '') .strip은 똑같이 작동하고 새로운 객체를 많이 만들 필요가 없으므로 조금 빨라집니다. –

2

노코 기리의 Nokogiri::XML::Node#content이 그것을 할 것입니다 :

내가 XML 때문에, (완전히 잘되는 어쨌든 공간으로 모든 줄 바꿈을 전환 할거야 경우
irb(main):020:0> node 
=> <h1> 
    Hello<span class="punctuation">,</span> 
    <span class="noun">World<span class="punctuation">!</span> 
</span> 
</h1> 
irb(main):021:0> node.content 
=> "\n Hello,\n World!\n\n" 
+0

#text와 #content가 동일하므로 Aaron이 "Answer"b/c를 얻었으므로 공백도 처리했습니다. +1, 비록 :) –

+0

플러스, 그는 먼저 자신의 대답을 올렸습니다. – Pesto