LoginSignup
35
39

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-24

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!

詳しい使い方

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

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

35
39
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
35
39