1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

Nokogiriパッケージを使ってXML形式のデータを操作するためのRubyチュートリアル

2022-01-31 02:04:34

インストール方法

Ubuntuの場合、libxml2、libxsltコンポーネントをインストールする必要があります。

$ apt-get install libxml2 libxslt



それなら、できる。

$ gem install nokogiri



オプション
nokogiriは、ファイルをパースするためのオプションをいくつか用意していますが、一般的なものは以下の通りです。

  • NOBLANKS : 空のノードを削除する
  • NOENT : エンティティの代用
  • NOERROR : エラー報告を隠す
  • STRICT : 正確なパース、ファイル例外のパース時にエラーを投げる。
  • NONET : 解析中のネットワーク接続を無効にします。

オプションの使用例(ブロックコールによる)。

doc = Nokogiri::XML(File.open("blossom.xml")) do |config|
config.strict.nonet
end


または

doc = Nokogiri::XML(File.open("blossom.xml")) do |config|
config.options = Nokogiri::XML::ParseOptions::STRICT | Nokogiri::XML::ParseOptions::NONET
end


パース

は、ファイル、文字列、URLなどからパースすることができます。Nokogiri::HTML、Nokogiri::XMLの2つのメソッドに依存する。

文字列を読み込むには

html_doc = Nokogiri::HTML("<html><body><h1>Mr. Belvedere Fan Club</h1></body></html>")
xml_doc = Nokogiri::XML("<root><aliens><aliens><name>Alf</name></alien></aliens></ root>")


ファイルを読み込む。

f = File.open("blossom.xml")
doc = Nokogiri::XML(f)
f.close


URLを読み取る。

require 'open-uri'
doc = Nokogiri::HTML(open("http://www.threescompany.com/"))


ノードの検索

CSS セレクタだけでなく、XPATH も検索に使用できます。

<books>
 <book>
 <title>Stars</title>
 </book>
 <book>
 <title>Moon</title>
 </book>
</books>



xpathを使用します。

@doc.xpath("//title")



cssを使用します。

@doc.css("book title")



ノードの内容を変更する

title = @doc.css("book title").firsto
title.content = 'new title'
puts @doc.to_html

# =>
...
 <title>new title</title>
...



ノードの構造を変更する

first_title = @doc.at_css('title')
second_book = @doc.css('book').last

# You can put the first title into the second book
first_title.parent = second_book

# You can also place it as you like.
second_book.add_next_sibling(first_title)

# You can also modify the corresponding class
first_title.name = 'h2'
first_title['class']='red_color'
puts @doc.to_html
# => <h2 class='red_color'>... </h2>

# You can also create a new node
third_book = Nokogiri::XML::Node.new 'book', @doc
third_book.content = 'I am the third book'
second_book.add_next_sibling third_book
puts @doc.to_html
# =>
...
<books>
 ...
 <book> I am the third book</book>
</books>