2012-07-06 2 views
3

튜토리얼을 통해 튜토리얼을 읽었지만 나에게 맞는 것은 없다. 목표는 요소와 속성이있는 XML 문서를 가져 와서 데이터베이스에 데이터를 삽입하는 것입니다. 각 요소/속성은 데이터베이스의 열이며 각 항목은 행입니다. 여기에 내가 작업했던 만들어 낸 XML의 문서는 다음과 같습니다 XML 문서를 Rails 데이터베이스로 가져 오기?

<?xml version="1.0"?> 
<library> 
    <NAME><![CDATA[Favorite Books]]></NAME> 
    <book ISBN="11342343"> 
    <title>To Kill A Mockingbird</title> 
    <description><![CDATA[Description#1]]></description> 
    <author>Harper Lee</author> 
    </book> 
    <book ISBN="989894781234"> 
    <title>Catcher in the Rye</title> 
    <description><![CDATA[This is an extremely intense description.]]></description> 
    <author>J. D. Salinger</author> 
    </book> 
    <book ISBN="123456789"> 
    <title>Murphy's Gambit</title> 
    <description><![CDATA[Daughter finds her dad!]]></description> 
    <author>Syne Mitchell</author> 
    </book> 
</library> 

그래서 나는이 개 항목에 ISBN을 가진 각 항목의 제목, 설명, 저자와 테이블을 갖고 싶어. 그게 기본이야. (CDATA는 완전히 선택 사항입니다. 문제의 일부분이라면 반드시 제거하십시오 ...)

최종 목표는 좀 더 복잡합니다. 여러 권의 책이있는 여러 도서관. 데이터베이스는 그들 사이에 관계가 있으므로 내 Book 데이터베이스에서 Library 데이터베이스를 참조 할 수 있으며 그 반대의 경우도 마찬가지입니다. 나는 완전히 신참이다. 확실히 신인이지만, 나는 잘 작동하는 컴퓨터 지식을 가지고 있으며, 시험하고 시험해보고 싶어한다.

레일즈 3.2.6을 기본 SQLite3 데이터베이스 (3.6.20)와 함께 사용하고 있습니다. REXML, ROXML, LibXML 등을 설치하고 API 및 연습을 통해 읽었지만 문제가 해결되지 않았습니다. .title, .author, .isbn 및 .description 메소드가있는 Book 객체를 사용하여 XML 문서를 Library 객체 (.name 메소드 사용)로 쉽게 변환 할 수 있어야합니다.

도움이 정말 감사합니다!

업데이트!

오케이, 다음 질문. 나는이 배경의 논리에 속고 있었고 다음을 수행하는 가장 좋은 방법을 알고 싶었다. ...

이 새롭고 향상된 XML 파일이 있다고 가정 해 보겠습니다.

<?xml version="1.0"?> 
<RandomTag> 
    <library name='Favorite Books'> 
    <book ISBN="11342343"> 
     <title>TKAM</title> 
     <description>Desc1</description> 
     <author>H Lee</author> 
    </book> 
    <book ISBN="989894781234"> 
     <title>Catcher in the Rye</title> 
     <description>Desc2</description> 
     <author>JD S</author> 
    </book> 
    </library> 
    <library name='Other Books'> 
    <book ISBN="123456789"> 
     <title>Murphy\'s Gambit</title> 
     <description>Desc3</description> 
     <author>Syne M</author> 
    </book> 
    </library> 
</RandomTag> 

그래서 지금 우리는 두 개의 라이브러리를 가지고있는 최초의 "좋아하는 책"과라는 제목의이 책, "다른 책"이라는 제목의 두 번째를 갖고, 하나의 책을 가지고.

각 서적이 속한 라이브러리를 확인하는 가장 좋은 방법은 무엇입니까? 원래는 도서관 데이터베이스와 도서 데이터베이스를 만들었습니다. 각 Book 객체에는 올바른 라이브러리를 참조하는 library_id 필드가 있습니다. 따라서 각 데이터베이스는 "@ library.books.each do | b | b.title"과 같은 구문을 사용하여 올바르게 채울 수 있습니다. 그러나 이것은 하나의 라이브러리가있는 경우에만 작동했습니다.

비슷한 라이브러리 루프에서 내게 준 Book 루프를 중첩 시키려고했으나 .css 메서드는 어디에 위치하든 관계없이 모든 단일 일치를 찾습니다. 특정 지점을 찾을 수있는 .css 메서드가 있습니까?

각주를 해당 라이브러리로 가져올 수 있기를 바랍니다. XML 파일에 필드를 추가 할 수 없습니다.

다시 한번 감사드립니다.

답변

7

Nokogiri 라이브러리를 사용하여 비슷한 작업을 수행했습니다.

doc = Nokogiri::XML(xml_data) 

doc.css('book').each do |node| 
    children = node.children 

    Book.create(
    :isbn => node['ISBN'], 
    :title => children.css('title').inner_text, 
    :description => children.css('description').inner_text, 
    :author => children.css('author').inner_text 
) 
end 

당신은이 작업을 수행하여 빠른 테스트를 만들 수

업데이트 :

gem install nokogiri 

그런 다음 text_xml.rb와라는 파일을 만듭니다

첫째는 노코 기리 보석을 설치 내용 :

require 'nokogiri' 

doc = Nokogiri::XML('<?xml version="1.0"?> 
    <library> 
    <NAME><![CDATA[Favorite Books]]></NAME> 
    <book ISBN="11342343"> 
     <title>To Kill A Mockingbird</title> 
     <description><![CDATA[Description#1]]></description> 
     <author>Harper Lee</author> 
    </book> 
    <book ISBN="989894781234"> 
     <title>Catcher in the Rye</title> 
     <description><![CDATA[This is an extremely intense description.]]></description> 
     <author>J. D. Salinger</author> 
    </book> 
    <book ISBN="123456789"> 
     <title>Murphy\'s Gambit</title> 
     <description><![CDATA[Daughter finds her dad!]]></description> 
     <author>Syne Mitchell</author> 
    </book> 
    </library>') 

doc.css('book').each do |node| 
    children = node.children 

    book = { 
    "isbn" => node['ISBN'], 
    "title" => children.css('title').inner_text, 
    "description" => children.css('description').inner_text, 
    "author" => children.css('author').inner_text 
    } 

    puts book 
end 
01 23,516,

그리고 마지막으로 실행

ruby test_xml.rb 

나는 당신이 당신의 XML에 붙여 넣을 때 머피의 책략에 작은 따옴표를 이스케이프되지 않은 생각한다.

+0

나는 Nokogiri와 함께 놀았지만, 아무 소용이 없다. 그러나 나는이 정확한 구문을 사용했다고 생각하지 않는다. 나는 그에게 총을주고 다시보고 할 것이다 ... –

+0

좋아, 이것은 나에게 오류를주지 않는다. 그래서 나는 우리가 올바른 길을 가고 있다고 생각한다. 그래도 아무것도하지 않니? 나는 이것을 레일 콘솔에 입력하고 있는데, 'end'를 입력하면 '0'으로보고됩니다. doc.root 또한 'nil'을 반환하므로 계획대로 진행되지 않는다고 생각합니다 ... 아이디어가 있으십니까? –

+0

@XMLSlayer 업데이트보기 – Mike

관련 문제