OgaというXML/HTMLパーサーがありました。
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!
詳しい使い方
詳しい使い方はドキュメントがしっかり用意されているので、それを参照してください。
モジュール(名前空間)とクラスの設計も明快なので、ドキュメントを順番に追えば、ソースを見る必要もなく、あまり悩むことなくやりたいことができると思います。