2014-05-21 2 views
0

http://www.heureka.cz/direct/xml-export/shops/heureka-sekce.xml과 같은 XML 파일이 있습니다. 그것이 내 것이 아니기 때문에 나는 그것을 바꿀 수 없다. 다른 웹 사이트에서 파싱하는 것입니다.레일 4는 표로 XML을 구문 분석

여기 (구조) XML의 : 최종 코드는 모두 여기에 코멘트에

<HEUREKA> 
    <CATEGORY> 
    <CATEGORY_ID>971</CATEGORY_ID> 
    <CATEGORY_NAME>Auto-moto</CATEGORY_NAME> 
    <CATEGORY> 
     <CATEGORY_ID>881</CATEGORY_ID> 
     <CATEGORY_NAME>Alkohol testery</CATEGORY_NAME> 
     <CATEGORY_FULLNAME>Heureka.cz | Auto-moto | Alkohol testery</CATEGORY_FULLNAME> 
    </CATEGORY> 
    </CATEGORY> 
</HEUREKA> 

감사

def heureka 
require 'open-uri' 
require 'nokogiri' 
doc = Nokogiri::XML(open("http://www.heureka.cz/direct/xml-export/shops/heureka-sekce.xml")) 

doc.xpath("//CATEGORY[CATEGORY_FULLNAME]").each do |node| 
record = Heureka.where("name" => node.css('CATEGORY_NAME').inner_text).first_or_initialize 
record.fullname=node.xpath('CATEGORY_FULLNAME').inner_text 
record.name=node.xpath('CATEGORY_NAME').inner_text                       
record.save unless record.fullname.blank?                         
end                                   
end       
+0

, 당신이하고 싶지 않고, 어떻게 지금 작동하고 무엇을 보여주십시오. 이 문서에는 몇 가지 수준의 범주가 있으므로 각 루프에서 확인해야합니다. – zishe

+0

@zishe 내 코드가 모든 레벨을 통과하고 CATEGORY_FULLNAME이 있으면 DB에 저장합니다. –

답변

1

우리는 당신의 XML을 들여 경우 문제가 표시됩니다

<HEUREKA> 
    <CATEGORY> 
    <CATEGORY_ID>971</CATEGORY_ID> 
    <CATEGORY_NAME>Auto-moto</CATEGORY_NAME> 
    <CATEGORY> 
     <CATEGORY_ID>881</CATEGORY_ID> 
     <CATEGORY_NAME>Alkohol testery</CATEGORY_NAME> 
     <CATEGORY_FULLNAME>Heureka.cz | Auto-moto | Alkohol testery</CATEGORY_FULLNAME> 
    </CATEGORY> 
    </CATEGORY> 
</HEUREKA> 

두 번째 범주 노드는 입니다. 첫 번째 범주 노드이므로 또한 그것의 아이. 이 때문에 children.css('CATEGORY_NAME').inner_text은 첫 번째 노드에 연결된 두 이름 (Auto-motoAlkohol testery)을 반환하고 마지막 노드는 예상 데이터 - (Alkohol testery)를 갖습니다. 당신이 XML을 변경할 수 없다면, 당신은 XPATH를 사용하는 대신 수

<HEUREKA> 
    <CATEGORY> 
    <CATEGORY_ID>971</CATEGORY_ID> 
    <CATEGORY_NAME>Auto-moto</CATEGORY_NAME> 
    </CATEGORY> 
    <CATEGORY> 
    <CATEGORY_ID>881</CATEGORY_ID> 
    <CATEGORY_NAME>Alkohol testery</CATEGORY_NAME> 
    <CATEGORY_FULLNAME>Heureka.cz | Auto-moto | Alkohol testery</CATEGORY_FULLNAME> 
    </CATEGORY> 
</HEUREKA> 

그리고 다시 시도 ...


업데이트

:

는 XML을 수정 CSS, 기본 동작은 즉각 아동을 찾는 것입니다. 모든 어린이 (어린이)보다

def heurekacat 
    require 'open-uri' 
    require 'nokogiri' 
    doc = Nokogiri::XML(open("http://www.heureka.cz/direct/xml-export/shops/heureka-sekce.xml")) 
    doc.css("CATEGORY").each do |node| 
    record = HeurekaCat.where("name" => children.xpath('CATEGORY_NAME').inner_text).first_or_initialize 
    record.category=node.xpath('CATEGORY_FULLNAME').inner_text 
    record.name=node.xpath('CATEGORY_NAME').inner_text 
    record.save 
    end 
end 
+0

안녕하세요, XML을 수정할 수 없습니다, 나는 중첩 된 범주에 대한 솔루션을 찾아야 만 채워진 이있는 카테고리 만 저장해야합니다. –

+0

@TomasKrmela - XML을 수정할 수없는 경우에 대한 해결책을 추가했습니다. –

+0

CATEGORY_FULLNAME이 노드에 제시된 경우에만 db에 저장 –

5

이 장소에서 노코 기리를 사용하면 큰 소리로 보입니다. 일반 루비로 이것을 할 수 있습니다 :

require 'net/http' 
xml_content = Net::HTTP.get(URI.parse('http://www.heureka.cz/direct/xml-export/shops/heureka-sekce.xml')) 
data = Hash.from_xml(xml_content) 

그러면 해시 객체로 데이터에 액세스 할 수 있습니다. 다음에

doc.css("CATEGORY").each do |node| 

:

+0

안녕하세요. 죄송하지만 나는 초보자 다. 으로 채워진 카테고리 만 저장하는 방법을 말해 줄 수 있습니까? –

0

단순히 하나 개의 라인을 변경

doc.css("CATEGORY:has(CATEGORY_FULLNAME)").each do |node| 

이것은 CATEGORY_FULLNAME 하위 요소를 포함 만 CATEGORY 요소를 선택한다. 대안으로

, 등가의 XPath :

doc.xpath("//CATEGORY[CATEGORY_FULLNAME]").each do |node|