Latest web development tutorials

ルビーXML、XSLTとXPathのチュートリアル

XMLとは何ですか?

これは、拡張マークアップ言語XML(拡張マークアップ言語)を意味します。

拡張マークアップ言語、標準一般化マークアップ言語は、構造化マークアップ言語を持っている電子文書をマーキングするための方法のサブセット。

これは、データ型を定義する、データをタグ付けするために使用することができ、ユーザーが自分のマークアップ言語のソース言語を定義することを可能にする技術です。 これは、記述し、構造化データのアプリケーションやベンダーに依存しない交換に統一されたアプローチを提供し、ウェブの伝送に最適です。

詳細については、私たちを参照してくださいXMLのチュートリアルを


XMLパーサーとAPIの構造

XMLパーサSAXとDOMは、主に2種類あります。

  • SAXパーサは、イベントベースの処理であり、XML文書のスキャンがスキャン処理において、再び最初から最後まで必要があり、文法構造を経験するたびに、それは、アプリケーションを送信する、イベントハンドラ特定の文法構造を呼び出しますイベント。
  • DOMドキュメントオブジェクトモデルの分析、文書の階層構造物文法構造は、文書がWenchengを解析し、識別するためのオブジェクトとしてメモリDOMツリーのノードにDOMツリーを確立し、全体のDOMツリーはメモリに文書化されます。

Rubyは解析およびXMLを作成します

XML文書のRUBYの解析は、このライブラリREXMLライブラリを使用することができます。

REXMLライブラリーは、XMLツールキットのルビーは、純粋なRuby言語を使用XML1.0の規範に従うことです。

ruby1.8の以降のバージョンでは、ライブラリはRUBY REXMLが含まれます。

パスREXMLライブラリです:REXML /ドキュメント

すべてのメソッドとクラスはREXMLモジュールにパッケージ化されています。

REXMLパーサは、他のパーサに比べて次のような利点があります。

  • ルビーによって書かれた100%。
  • SAXとDOMパーサに適用されます。
  • これは、コードの2000行未満、軽量です。
  • メソッドやクラスを理解しやすいです。
  • ベースのSAX2 APIおよびXPathの完全サポート。
  • 個別のインストールを必要とせずに、Rubyのインストールを使用します。

以下は、movies.xmlとして保存し、XMLコードの例です。

<collection shelf="New Arrivals">
<movie title="Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
   <movie title="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

DOMパーサ

まず、我々はREXML /ドキュメントライブラリを導入し、私たちは通常、導入トップレベルの名前空間REXMLであることができるXMLデータを解析するために開始してみましょう:

#!/usr/bin/ruby -w

require 'rexml/document'
include REXML

xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)

# 获取 root 元素
root = xmldoc.root
puts "Root element : " + root.attributes["shelf"]

# 以下将输出电影标题
xmldoc.elements.each("collection/movie"){ 
   |e| puts "Movie Title : " + e.attributes["title"] 
}

# 以下将输出所有电影类型
xmldoc.elements.each("collection/movie/type") {
   |e| puts "Movie Type : " + e.text 
}

# 以下将输出所有电影描述
xmldoc.elements.each("collection/movie/description") {
   |e| puts "Movie Description : " + e.text 
}

上の例の出力は、次のとおりです。

Root element : New Arrivals
Movie Title : Enemy Behind
Movie Title : Transformers
Movie Title : Trigun
Movie Title : Ishtar
Movie Type : War, Thriller
Movie Type : Anime, Science Fiction
Movie Type : Anime, Action
Movie Type : Comedy
Movie Description : Talk about a US-Japan war
Movie Description : A schientific fiction
Movie Description : Vash the Stampede!
Movie Description : Viewable boredom
SAX-like Parsing:

SAXパーサー

同じデータファイル処理:movies.xmlを、SAX解析は小さなファイルとして推奨されていない、次は簡単な例を示します。

#!/usr/bin/ruby -w

require 'rexml/document'
require 'rexml/streamlistener'
include REXML


class MyListener
  include REXML::StreamListener
  def tag_start(*args)
    puts "tag_start: #{args.map {|x| x.inspect}.join(', ')}"
  end

  def text(data)
    return if data =~ /^\w*$/     # whitespace only
    abbrev = data[0..40] + (data.length > 40 ? "..." : "")
    puts "  text   :   #{abbrev.inspect}"
  end
end

list = MyListener.new
xmlfile = File.new("movies.xml")
Document.parse_stream(xmlfile, list)

出力は、上記。

tag_start: "collection", {"shelf"=>"New Arrivals"}
tag_start: "movie", {"title"=>"Enemy Behind"}
tag_start: "type", {}
  text   :   "War, Thriller"
tag_start: "format", {}
tag_start: "year", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
  text   :   "Talk about a US-Japan war"
tag_start: "movie", {"title"=>"Transformers"}
tag_start: "type", {}
  text   :   "Anime, Science Fiction"
tag_start: "format", {}
tag_start: "year", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
  text   :   "A schientific fiction"
tag_start: "movie", {"title"=>"Trigun"}
tag_start: "type", {}
  text   :   "Anime, Action"
tag_start: "format", {}
tag_start: "episodes", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
  text   :   "Vash the Stampede!"
tag_start: "movie", {"title"=>"Ishtar"}
tag_start: "type", {}
tag_start: "format", {}
tag_start: "rating", {}
tag_start: "stars", {}
tag_start: "description", {}
  text   :   "Viewable boredom"

XPathとルビー

我々は(:参照情報はXML言語で文書です見つけるために、XMLを表示するには、XPathをXPathを使用することができますXPathのチュートリアル )。

XPathは、XMLパス言語であり、それは、XML(標準一般化マークアップ言語のサブセット)の言語の場所の部分を決定するために使用される方法です。 XPathベースのXMLツリー、ツリー内のデータ構造のノードで検索する機能を提供します。

分析(Document Object Model)ツリーに基づいていますREXMLクラスによるRubyのXPathのサポートのXPath。

#!/usr/bin/ruby -w

require 'rexml/document'
include REXML

xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)

# 第一个电影的信息
movie = XPath.first(xmldoc, "//movie")
p movie

# 打印所有电影类型
XPath.each(xmldoc, "//type") { |e| puts e.text }

# 获取所有电影格式的类型,返回数组
names = XPath.match(xmldoc, "//format").map {|x| x.text }
p names

上の例の出力は、次のとおりです。

<movie title='Enemy Behind'> ... </>
War, Thriller
Anime, Science Fiction
Anime, Action
Comedy
["DVD", "DVD", "DVD", "VHS"]

XSLTとRuby

Rubyは2 XSLTパーサを持って、簡単な説明を以下に示します:

ルビー-よるSablotron

このパーサは、正義正義Takahashによって書かれ、維持されています。 これは主に、Linuxオペレーティングシステム用に書かれている、あなたは以下のライブラリが必要です:

  • Sablot
  • iconv
  • Expatの

あなたがすることができますルビー-よるSablotronは、これらのライブラリを見つけます。

XSLT4R

マイケル・ノイマンによって書かれXSLT4R。 単純なコマンドラインの相互作用のためXSLT4Rは、サードパーティアプリケーションは、XML文書を変換するために使用することができます。

XSLT4Rは100%RubyのモジュールであるXSLT4Rアーカイブを含め、XMLScan操作を必要としています。 これらのモジュールは、標準のRubyのインストール方法(すなわちルビーinstall.rb)インストールを使用することができます。

次のようにXSLT4Rの構文は次のとおりです。

ruby xslt.rb stylesheet.xsl document.xml [arguments]

アプリケーションでXSLT4Rを使用したい場合は、あなたが必要なXSLTと入力パラメータを導入することができます。 例としては、次のとおりです:

require "xslt"

stylesheet = File.readlines("stylesheet.xsl").to_s
xml_doc = File.readlines("document.xml").to_s
arguments = { 'image_dir' => '/....' }

sheet = XSLT::Stylesheet.new( stylesheet, arguments )

# output to StdOut
sheet.apply( xml_doc )

# output to 'str'
str = ""
sheet.output = [ str ]
sheet.apply( xml_doc )

さらに詳しい情報