Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Ogaってゆー新しいXML/HTMLパーサーについて

More than 5 years have passed since last update.

OgaというXML/HTMLパーサーがありました。

https://github.com/YorickPeterse/oga

XML/HTMLパーサーには、標準のREXML以外にもすでにNokogiriやOxがありますが、
Rubiniusでうまく動かなかった(GVLでロックされないから?)ので、極力C拡張を使わずに作ったものだそうです。

MRIでもNokogiriのインストールは時として鬼門になったりするので、ナイスな代替があれば嬉しいかも。

機能とか特徴

  • XMLとHTML(5)のパース
    • DOMパース
    • ストリーム/プルパース
    • SAXパース
  • 少ないメモリ消費量
  • 高パフォーマンス。パフォーマンスが十分に出てなければそれはバグだ。
  • XPath 1.0のサポート
  • XML名前空間のサポート

らしいです。

インストール

いつものように。

$ gem install oga
require 'oga'

使用例

READMEからいくつか例を載せます。
元のREADMEには他にも書いてあります。

XML文字列をパースする

Oga.parse_xml('<people><person>Alice</person></people>')

Document(
  children: NodeSet(Element(name: "people" children: NodeSet(Element(name: "person" children: NodeSet(Text("Alice"))))))
)

HTML文字列をパースする

Oga.parse_html('<link rel="stylesheet" href="foo.css">')

Document(
  children: NodeSet(Element(name: "link" attributes: [Attribute(name: "rel" value: "stylesheet"), Attribute(name: "href" value: "foo.css")]))
)

XMLを指すIOオブジェクトを指定してパースする

ファイルなどIOオブジェクトを直接指定できます。

handle = File.open('path/to/file.xml')

Oga.parse_xml(handle)

プルパーサーでIOオブジェクトをパースする

プルパーサーも使えます。楽ちん。

<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
handle = File.open('path/to/file.xml')
parser = Oga::XML::PullParser.new(handle)

parser.parse do |node|
  parser.on(:text) do
    puts node.text unless node.text.strip.empty?
  end
end

Tove
Jani
Reminder
Don't forget me this weekend!

詳しい使い方

詳しい使い方はドキュメントがしっかり用意されているので、それを参照してください。

http://code.yorickpeterse.com/oga/latest/

モジュール(名前空間)とクラスの設計も明快なので、ドキュメントを順番に追えば、ソースを見る必要もなく、あまり悩むことなくやりたいことができると思います。

5t111111
Engineering Manager @ KODANSHAtech
kodanshatech
現代ビジネス、FRIDAYデジタル、ブルーバックス、FRaU、ViVi、VOCEなど講談社のウェブメディアやデジタルコンテンツ開発を行っています。
https://kodansha.tech/ja
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away