2011-04-28 3 views
3

으로 찾는 요소 :노코 기리 내가 다음 코드로 노코 기리를 사용하여 XML 파일을 구문 분석하고 이름

doc.xpath('//root').each do |root| 
    puts "# ROOT found" 
    root.xpath('//page').each do |page| 
    puts "## PAGE found/#{page['id']}/#{page['name']}/#{page['width']}/#{page['height']}" 
    page.children.each do |content| 
     ... 
    end 
    end 
end 

가 어떻게 페이지 요소의 모든 요소를 ​​구문 분석 할 수 있습니까? 이미지, 텍스트 및 비디오의 세 가지 요소가 있습니다. 각 요소에 대해 case 문을 작성하려면 어떻게해야합니까?

답변

10

솔직히, 당신은 문제의이 종류에 유용 할 수있는

doc.xpath('//root').each do |root| 
    puts "# ROOT found" 
    root.xpath('//page').each do |page| 
    puts "## PAGE found/#{page['id']}/#{page['name']}/#{page['width']}/#{page['height']}" 
    page.children.each do |child| 
     case child.name 
     when 'image' 
      do_image_stuff 
     when 'text' 
      do_text_stuff 
     when 'video' 
      do_video_stuff 
     end 
    end 
    end 
end 
+0

감사합니다. 실제로 일치를 사용하여 직접 해결할 수 있습니까? (selector) method :) – Tronic

5

두 노코 기리의 CSS와 XPath에 접근 여러 태그를 지정할 수 있습니다 .. 나에게 아주 가까이 보인다. 문서의 page 태그의 모든 태그를 통해 걸어보다는 :

require 'nokogiri' 

doc = Nokogiri::XML(' 
    <xml> 
    <body> 
    <image>image</image> 
    <text>text</text> 
    <video>video</video> 
    <other>other</other> 
    <image>image</image> 
    <text>text</text> 
    <video>video</video> 
    <other>other</other> 
    </body> 
    </xml>') 

이 검색 사용하는 CSS는 다음과 같습니다

doc.search('image, text, video').each do |node| 
    case node.name 
    when 'image' 
    puts node.text 
    when 'text' 
    puts node.text 
    when 'video' 
    puts node.text 
    else 
    puts 'should never get here' 
    end 
end 

# >> image 
# >> image 
# >> text 
# >> text 
# >> video 
# >> video 

주의 그것은 CSS 접근이 지정하는 순서에 태그를 반환합니다. 문서에서 태그의 순서를해야하는 경우에는 XPath를 사용할 수 있습니다 모든 검색이 루비의 처리에 필요한 노드 만 반환 libXML 발생하기 때문에 두 경우 모두

doc.search('//image | //text | //video').each do |node| 
    puts node.text 
end 

# >> image 
# >> text 
# >> video 
# >> image 
# >> text 
# >> video 

을 프로그램이 빠르게 실행한다 . 당신이 <page> 태그 내에서 검색을 제한해야하는 경우

당신은 그 아래 검색하십시오 page 노드를 찾기 위해 정면 검색을 수행 할 수 있습니다

doc.at('page').search('image, text, video').each do |node| 
    ... 
end 

또는

doc.at('//page').search('//image | //text | //video').each do |node| 
    ... 
end 
관련 문제