Edited at

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

More than 3 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/

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