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
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした