2017-05-16 5 views
0

Ruby를 사용하여 XML 파일을 구문 분석하려고합니다. 그것은 성공적으로 구문 분석하지만 내가 그것을 인쇄 할 것을 인쇄되지 않습니다Ruby를 사용하여 XML 파일을 구문 분석하고 인쇄하는 방법

require 'rubygems' 
require 'nokogiri' 

def parseXML(filename) 
    page = Nokogiri::XML(open(filename)) 
    puts page.class 

page.css('//ssn//p').each do |a| 

    puts a['qn'] 

    page.css('//ssn//p//v').each do |e| 

     puts e['fans'] 

     end 
    end 
    end 

if __FILE__ == $0 
    parseXML('CS 141 FALL 2016/SessionData/L1611021411.xml') 
end 

XML 파일의 형식은 다음과 같습니다

<ssn > 
<p strt="14:13:09" qn="Question 1" stp="14:14:20"> 
    <v fans="C" id="#00A4DB7F" ans="C" fanst="33.59"/> 
    <v fans="A" id="#3910072E" ans="D" fanst="50.71"/> 
    <v fans="A" id="#3C44F58D" ans="A" fanst="20.71"/> 
    <v fans="B" id="#3C62633D" ans="B" fanst="10.78"/> 
    </p> 
    <p strt="14:20:17" qn="Question 2" stp="14:21:24"> 
    <v fans="A" id="#00A4DB7F" ans="D" fanst="33.59"/> 
    <v fans="E" id="#3910072E" ans="C" fanst="50.71"/> 
    <v fans="E" id="#3C44F58D" ans="B" fanst="20.71"/> 
    <v fans="C" id="#3C62633D" ans="A" fanst="10.78"/> 
    </p> 
    <p strt="14:22:17" qn="Question 3" stp="14:23:24"> 
    <v fans="A" id="#00A4DB7F" ans="A" fanst="33.59"/> 
    <v fans="B" id="#3910072E" ans="B" fanst="50.71"/> 
    <v fans="C" id="#3C44F58D" ans="C" fanst="20.71"/> 
    <v fans="D" id="#3C62633D" ans="D" fanst="10.78"/> 
    </p> 
    </ssn> 

내가 인쇄 할 :

Question 1: 
C 
A 
A 
B 

Question 2: 
A 
E 
E 
C 

Question 3: 
A 
B 
C 
D 

그러나 대신 다음을 인쇄합니다.

Question 1: 
C 
A 
A 
B 
A 
E 
E 
C 
A 
B 
C 
D 

Question 2: 
C 
A 
A 
B 
A 
E 
E 
C 
A 
B 
C 
D 

Question 3: 
C 
A 
A 
B 
A 
E 
E 
C 
A 
B 
C 
D 
+0

질문 할 때 표시되는 것이 무엇이 문제인지 정확히 나타내는 것이 중요합니다. 즉, 서식을 사용할 수 있어야합니다. 시간을내어 읽고 이해할 수있게하십시오. 당신이 우리에게 당신을 도울 것을 권유합니다. 쉽게 액세스 할 수 있도록 서식 페이지에서 도움말을 사용할 수 있습니다. –

+0

@ theTinMan 도와 주셔서 감사합니다. 나는 그것에 대해 연구 할 것이다. –

+0

참고 : 질문 할 때 문제를 설명하는 데 필요한 최소한의 정보 만 입력해야합니다. 그 이상의 것들이 우리가 당신을위한 해결책을 찾으려고 할 때 우리 시간을 낭비합니다."당신의 생각은 우리가 보는 것만 큼 나쁘지는 않지만 질문을 마감하는 이유이며, 명확하고 간결한 질문을 작성하는 데 도움이되는 노력이 중요합니다. –

답변

1

'//ssn//p' 
'//ssn//p//v' 

노코 기리이를 사용하기 전에이를 테스트하고 XPath에로 취급 그들이 그렇게 XPath를있어 생각 : 문제는 CSS 선택기는 CSS하지 않으며 올바른 XPath는 점이다.

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<ssn> 
    <p qn="Question 1"> 
    <v ans="C"/> 
    <v ans="D"/> 
    <v ans="A"/> 
    <v ans="B"/> 
    </p> 
    <p qn="Question 2"> 
    <v ans="D"/> 
    <v ans="C"/> 
    <v ans="B"/> 
    <v ans="A"/> 
    </p> 
    <p qn="Question 3"> 
    <v ans="A"/> 
    <v ans="B"/> 
    <v ans="C"/> 
    <v ans="D"/> 
    </p> 
</ssn> 
EOT 

doc.search('p').each { |p| 
    puts "#{ p['qn'] }:" 
    puts p.search('v').map { |v| v['ans'] } 
    puts 
} 

생성합니다 : 당신이 사용하고있는 XPath를 선택기로

Question 1: 
C 
D 
A 
B 

Question 2: 
D 
C 
B 
A 

Question 3: 
A 
B 
C 
D 

문제는 보조 //입니다

는 내가 CSS를 사용하는 거라고 원하는 출력을 얻을합니다. XPath-ese //에서 문서의 맨 위에서 시작하여 모든 부분을 검색한다는 의미입니다. 그래서 //ssn//p는 "상단에서 시작 <ssn> 다음 상단에서 시작 <p>을 발견했습니다. 대신 당신이 의미하는 //ssn/p을 원한다"의미 "다음 그 안에서 <p>를 찾을 상단에서 시작 <ssn>을 찾을 수 있습니다.

셀렉터 위 가질 수 기록 된 :..

doc.search('//p').each { |p| 
    puts "#{ p['qn'] }:" 
    puts p.search('./v').map { |v| v['ans'] } 
    puts 
} 

것 출력 같은 일

그것은 일반적으로 더 읽기 선택기 결과 때문에 나는 더 강력하기 때문에 가끔 XPath를 사용, CSS를 사용하는 것이 좋습니다

노코 기리는 searchat; atsearch('some selector').first과 같습니다. Nokogiri는 선택자가 CSS 또는 XPath를 사용하는지 파악하려고 시도합니다. CSS 및 XPath의 특정 메서드도 있습니다. cssxpathsearchat_cssat_xpathat 버전입니다. 결과에 따라 Nokogiri는 선택 도구의 유형에 대한 절대적인 설명이 아닌 *css 또는 *xpath 변형을 힌트로만 사용합니다. 나는 코드를 보면서 확신을 가질 것입니다.