XPath式
REXMLはXPathもサポートします。XPathを使用すると、OSのファイルシステムのディレクトリに似た構文を使用して、XML文書の一部にアクセスできます。では、ギターリストの最初のmodelをプリントしてみましょう。そのためには、XML文書内の最初のmodel要素を探す必要があります。この処理をREXMLのXPath APIを使用して実行するには、次のコードを使用します。
require "rexml/document" include REXML # so that we don't have to prefix everything with # REXML::... doc = Document.new File.new("guitars.xml") # print doc firstmodel = XPath.first( doc, "//model" ) print firstmodel
XPath.firstは、コレクション内の最初の要素を返すメソッドです。このメソッドを使用して、doc文書内の最初の要素を取得できます。ここでは、XPath.firstに"//model"というXPath式を指定することで、ルート要素("//"で指定)から検索をスタートし、すべてのmodel要素を探すよう指示しています。このスクリプトを実行すると、次のように出力されます。
次は、すべてのギターの年式をプリントします。年式はmodel要素のyear属性として格納されています。この処理を行うには、XPath.eachメソッドに//model/attribute::yearというXPath式を渡します。
require "rexml/document" include REXML # so that we don't have to prefix everything with # REXML::... doc = Document.new File.new("guitars.xml") XPath.each( doc, "//model/attribute::year") { |element| puts element }
このスクリプトを実行すると、次のように出力されます。
REXMLで文書を更新する
REXMLでXML文書要素にアクセスする方法を理解したところで、今度はREXML APIを使って文書を更新してみましょう。APIを使用して、新しいギターメーカーとそのメーカーのモデルを1つ追加します。「REXMLUpdateTest.rb」という名前の新しいファイルに、次のコードを入力してください。
require "rexml/document" include REXML # so that we don't have to prefix everything with # REXML::... doc = Document.new File.new("guitars.xml") root = doc.root make = Element.new "make" make.attributes["name"] = "Gibson" model = Element.new "model" model.attributes["sn"] = "99999999" model.attributes["year"] = "2007" model.attributes["country"] = "USA" model.add_element "name" model.elements["name"].text = "SG" model.add_element "price" model.elements["price"].text = "1250.00" model.add_element "color" model.elements["color"].text = "Red" make.add_element model root.add_element make print doc
このコードでは、まず文書のルート要素を取得し、その要素を変数rootに格納します。次に、make要素とmodel要素を作成します。属性と要素の両方をmodel要素内に作成していることに注目してください。そして最後に、modelをmakeの子要素として追加し、makeを文書ルートに追加しました。このスクリプトを実行すると、次のように表示されます。
ギターリストに新しいメーカーとそのメーカーのモデルが追加されました。
まとめ
この記事では、REXMLライブラリに注目し、このライブラリを使って、RubyアプリケーションやRailsアプリケーションでXMLを処理する方法を紹介しました。RubyやRailsでは大抵のことが簡単にできますが、REXMLでも同様に、セットアップとプログラミングを簡単かつ直感的に行うことができます。
REXMLを利用すると、XMLサポートを容易にアプリケーションに追加できます。操作の習得も簡単です。REXMLが提供する機能は他にも多数あるので、じっくり調べて、役に立つものがないかどうか確認してみてください。



