2013-07-12 3 views
0

내가이 샘플 XML 파일을 구문 분석하는 것을 시도하고있다 : 여기루프를 사용하여 Nokogiri CSS 선택기로 XML을 구문 분석하는 방법은 무엇입니까?

<Collection version="2.0" id="74j5hc4je3b9"> 
    <Name>A Funfair in Bangkok</Name> 
    <PermaLink>Funfair in Bangkok</PermaLink> 
    <PermaLinkIsName>True</PermaLinkIsName> 
    <Description>A small funfair near On Nut in Bangkok.</Description> 
    <Date>2009-08-03T00:00:00</Date> 
    <IsHidden>False</IsHidden> 
    <Items> 
    <Item filename="AGC_1998.jpg"> 
     <Title>Funfair in Bangkok</Title> 
     <Caption>A small funfair near On Nut in Bangkok.</Caption> 
     <Authors>Anthony Bouch</Authors> 
     <Copyright>Copyright © Anthony Bouch</Copyright> 
     <CreatedDate>2009-08-07T19:22:08</CreatedDate> 
     <Keywords> 
     <Keyword>Funfair</Keyword> 
     <Keyword>Bangkok</Keyword> 
     <Keyword>Thailand</Keyword> 
     </Keywords> 
     <ThumbnailSize width="133" height="200" /> 
     <PreviewSize width="532" height="800" /> 
     <OriginalSize width="2279" height="3425" /> 
    </Item> 
    <Item filename="AGC_1164.jpg" iscover="True"> 
     <Title>Bumper Cars at a Funfair in Bangkok</Title> 
     <Caption>Bumper cars at a small funfair near On Nut in Bangkok.</Caption> 
     <Authors>Anthony Bouch</Authors> 
     <Copyright>Copyright © Anthony Bouch</Copyright> 
     <CreatedDate>2009-08-03T22:08:24</CreatedDate> 
     <Keywords> 
     <Keyword>Bumper Cars</Keyword> 
     <Keyword>Funfair</Keyword> 
     <Keyword>Bangkok</Keyword> 
     <Keyword>Thailand</Keyword> 
     </Keywords> 
     <ThumbnailSize width="200" height="133" /> 
     <PreviewSize width="800" height="532" /> 
     <OriginalSize width="3725" height="2479" /> 
    </Item> 
    </Items> 
</Collection> 

것은 내 현재 코드입니다 :

require 'nokogiri' 

doc = Nokogiri::XML(File.open("sample.xml")) 
somevar = doc.css("collection") 

#create loop 
somevar.each do |item| 
    puts "Item " 
    puts item['Title'] 
    puts "\n" 
end#items 

는 XML 문서의 루트에서 시작하여, 나는 루트에서 이동하기 위해 노력하고있어 "컬렉션"은 각각의 새로운 수준으로 내려갑니다.

노드 집합에서 시작하여 노드에서 정보를 가져오고 노드에 요소가 포함되어 있습니다. 노드를 변수에 어떻게 할당하고 그 아래의 모든 단일 레이어와 텍스트를 추출합니까?

아래 코드와 같은 것을 할 수 있지만 루프를 사용하여 XML의 각 중첩 요소를 체계적으로 이동하고 각 줄의 데이터를 출력하는 방법을 알고 싶습니다. 텍스트 표시가 끝나면 이전 요소/노드로 이동할 수 있습니다 (트리의 노드를 통과 함). NodeSet의 방법이 차례로 포함 된 모든 노드에서 작동하는 경향이 중요한 의미 차이

puts somevar.css("Keyworks Keyword").text 
+0

그래서 XML을 파싱 할 때 무엇을 캡처하고 싶습니까? 구문 분석 및 통과는 문제가되지 않지만 실제로 달성하려는 대상을 알아야합니다. –

+0

체크 아웃이 색소폰 파싱 옵션, http://amolnpujari.wordpress.com/2012/03/31/reading_huge_xml-rb/ 새로운 OX 루비 파서는 Nokogiri, https://gist.github.com/보다 5 배 빠릅니다. amolpujari/5966431 –

답변

0

노코 기리의 NodeSetNode 지원과 매우 유사 API를. 예를 들어 단일 노드의 children이 해당 노드의 자식을 가져 오는 동안 NodeSetchildren은 포함 된 모든 노드의 자식을 가져옵니다 (문서에서 발생하는 순서대로). 그래서, 모든 제목 및 모든 항목의 저자를 인쇄하려면이 작업을 수행 할 수 있습니다 :

require 'nokogiri' 

doc = Nokogiri::XML(File.open("sample.xml")) 

coll = doc.css("Collection") 

coll.css("Items").children.each do |item| 
    title = item.css("Title")[0] 
    authors = item.css("Authors")[0] 
    puts title.content if title 
    puts authors.content if authors 
end 

이 방법으로 트리의 모든 수준에서 얻을 수 있습니다. 또 다른 예 - 깊이 우선 (NB는 노드의 인쇄 된 표현은 그 아이의 인쇄 된 표현을 포함, 그래서 출력이 상당히 길어질 수 있습니다.) 트리의 모든 노드를 인쇄 검색 :

def rec(node) 
    puts node 
    node.children.each do |child| 
    rec child 
    end 
end 

물어 때문에 특히 노드의 부모 노드에 들어가려면 parent 메서드를 사용할 수 있습니다. 관심이있는 하위 트리가 들어있는 each 등을 NodeSet에있는 블록으로 처리 할 수 ​​있다면 결코 필요하지 않을 수 있습니다.

+0

Michal, 당신의 대답은 정말로 나를 도왔습니다. :) 지금 나를 괴롭히는 유일한 방법은 주어진 태그에서 어떻게 속성을 선택할 수 있는가입니다. 예를 들어, 태그의 일부에 "너비"와 "높이"가 있습니다 코드를 사용하는 사람들의 가치를 어떻게 얻을 수 있습니까? – camdixon

+0

노드에서 속성을 추출하는 데는 여러 가지 방법이 있습니다. 예를 들어,'attributes'는 속성과 값의 해쉬를 얻습니다. (네임 스페이스가 속성에서 벗겨지면'attribute_nodes'를 보아라.)'each'는 속성 이름/값 쌍을 반복한다. 노드,'children'의 반환 값에 반대). 자세한 내용은 [Nokogiri :: XML :: Node API 문서] (http://nokogiri.org/Nokogiri/XML/Node.html)를 참조하십시오. –

관련 문제