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

  • 36
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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/

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