3

チュートリアルを次々と読んでいますが、何もうまくいかないようです。目標は、要素と属性を含む XML ドキュメントを取得し、そのデータをデータベースに挿入することです。各要素/属性はデータベースの列になり、各エントリは行になります。これが、私が作業してきた作成済みの 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>

そこで、2 つのエントリを含むテーブルが必要です。各エントリには、ISBN、タイトル、説明、および作成者が含まれています。それが基本です。(CDATAは完全にオプションだと思います。それが私の問題の一部である場合は、ぜひ削除しましょう...)

最終目標はもう少し複雑です。複数の書籍を含む複数の図書館。データベースには相互の関係があるため、書籍データベースから図書館データベースを参照したり、その逆を行ったりすることができます。私は完全に道に迷っており、新人であることは間違いありませんが、コンピューターに関する十分な知識があり、試して試してみたいと思っています。

デフォルトの SQLite3 データベース (3.6.20) で Rails 3.2.6 を使用しています。REXML、ROXML、LibXML などをインストールし、API とウォークスルーを読みましたが、うまくいきません。Book オブジェクト (.title、.author、.isbn、および .description メソッドを持つ) を使用して、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>

これで、2 つのライブラリができました。1 つ目は「お気に入りの本」というタイトルで 2 本の本があり、2 つ目は「その他の本」というタイトルで 1 本の本があります。

各本がどの図書館に属しているかを知る最善の方法は何ですか? もともと、私は Library データベースと Book データベースを作成しました。各 Book オブジェクトには、正しい Library を参照する library_id フィールドがありました。したがって、各データベースは、「@library.books.each do |b| b.title」のような構文を使用して正しく入力できます。ただし、これは、ライブラリが 1 つしかない場合にのみ機能しました。

提供された Book ループを同様の Library ループ内に入れ子にしてみましたが、.css メソッドは、それがどこにあるかに関係なく、すべての一致を見つけます。UNTIL を特定のポイントで見つける .css メソッドはありますか?

言い換えれば、各本をそれぞれのライブラリにインポートできるようにしたいと思います。XML ファイルにフィールドを追加できません。

再度、感謝します。

4

1 に答える 1

11

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 をインストールします。

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 に貼り付けたときに、 Murphy's Gambitの一重引用符をエスケープしていなかったと思われます。

于 2012-07-06T22:51:53.263 に答える