2012-07-06 60 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> 

所以我想有一個表2級的條目,每個條目有一個ISBN,標題,描述和作者。這是基礎知識。 (CDATA是完全可選的,如果這是我的問題的一部分,請儘量讓我們擺脫它...)

最終目標有點複雜。具有多本書的多個圖書館。數據庫之間存在關係,所以我可以從Book數據庫中引用Library數據庫,反之亦然。我完全迷失了,絕對是一名菜鳥,但我有一個很好的計算機知識,並願意測試和嘗試。

我正在使用Rails 3.2.6與默認的SQLite3數據庫(3.6.20)。我已經安裝了REXML,ROXML,LibXML等,並通過API和演練閱讀,但事情並沒有解決。使用Book對象(具有.title,.author,.isbn和.description方法)必須有一種簡單的方法將XML文檔轉換爲Library對象(使用.name方法)。

任何幫助是真正apprecaited!

更新!

好的,接下來的問題。我一直在與這背後的邏輯鬼混,並想知道做下面的最佳方法...

假設我有這個新的和改進的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> 

所以現在我們有兩個庫,第一個標題爲「喜愛的書」,並具有2本書,第二題爲「電子書」,並有一本書。

什麼是每本書知道它屬於哪個庫的最佳方式?最初,我創建了一個庫數據庫和一個圖書數據庫。每個Book對象都有一個library_id字段,它引用了正確的Library。因此,每個數據庫都可以使用「@ 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 

更新

您可以通過這樣做創建一個快速測試:

首先安裝引入nokogiri寶石:

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 

最後運行:

ruby test_xml.rb 

我懷疑你不是逃避單引號中墨菲開局當你在你的XML粘貼。

+0

我也玩過Nokogiri,沒有用,但我不相信我用過這個確切的語法。我會給它一個鏡頭並報告回去...... – 2012-07-07 19:22:50

+0

好的,這不是給我一個錯誤,所以我想我們是在正確的軌道上。它雖然沒有做任何事情?我在軌道控制檯中輸入了這個信息,當我輸入'end'時,它只報告'0'。 doc.root也返回'零',所以我在想事情沒有按計劃進行...... 有沒有想法? – 2012-07-09 15:54:30

+0

@XMLSlayer查看更新 – Mike 2012-07-09 22:24:49

相關問題