Tutorial Ruby XML, XSLT dan XPath



Apakah itu XML?

XML merujuk kepada Bahasa Penanda eXtensible.

Bahasa Penanda Boleh Diperluas, subset Bahasa Penanda Universal Standard, bahasa penanda yang digunakan untuk menandakan dokumen elektronik untuk menjadikannya berstruktur.

Ia boleh digunakan untuk menandai data dan mentakrifkan jenis data Ia adalah bahasa sumber yang membolehkan pengguna mentakrifkan bahasa penanda mereka sendiri. Ia amat sesuai untuk pengangkutan World Wide Web, menyediakan pendekatan bersatu untuk menerangkan dan menukar data berstruktur bebas daripada aplikasi atau vendor.

Untuk maklumat lanjut, sila lihat tutorial XML kami


struktur penghurai XML dan API

Terdapat dua jenis penghurai XML utama: DOM dan SAX.

  • Penghurai SAX adalah berdasarkan pemprosesan acara dan perlu mengimbas dokumen XML dari awal hingga akhir semasa proses pengimbasan, ini akan dipanggil setiap kali struktur tatabahasa ditemui pengendali acara dengan struktur sintaks tertentu yang menghantar acara ke aplikasi.

  • DOM ialah penghuraian model objek dokumen, yang membina struktur sintaks hierarki dokumen dan mencipta pepohon DOM dalam ingatan Nod pepohon DOM dikenal pasti dalam bentuk objek . Selepas dokumen penghuraian dokumen selesai, Seluruh pepohon DOM dokumen diletakkan dalam ingatan.


Menghuraikan dan mencipta XML dalam Ruby

Untuk menghuraikan dokumen XML dalam RUBY, anda boleh menggunakan pustaka REXML.

Pustaka REXML ialah kit alat XML untuk ruby ​​Ia ditulis dalam bahasa Ruby tulen dan mematuhi spesifikasi XML1.0.

Dalam Ruby versi 1.8 dan lebih baru, REXML akan disertakan dalam pustaka standard RUBY.

Laluan pustaka REXML ialah: rexml/document

Semua kaedah dan kelas dirangkumkan ke dalam modul REXML.

Penghuraikan REXML mempunyai kelebihan berikut berbanding penghurai lain:

  • 100% ditulis dalam Ruby.

  • berfungsi dengan penghurai SAX dan DOM.

  • Ia ringan, kurang daripada 2000 baris kod.

  • Kaedah dan kelas yang mudah difahami.

  • Berdasarkan SAX2 API dan sokongan penuh XPath.

  • Menggunakan pemasangan Ruby dan bukannya pemasangan berasingan.

Berikut ialah kod XML bagi contoh, disimpan sebagai movies.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>

Penghurai DOM

Mari kita menghuraikan XML dahulukan Data, mula-mula kita memperkenalkan perpustakaan rexml/dokumen Biasanya kita boleh memperkenalkan REXML dalam ruang nama peringkat teratas:

#!/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 
}

Hasil keluaran contoh di atas ialah:

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:

Penghurai SAX

Proses fail data yang sama: movies.xml Tidak disyorkan untuk menghuraikan SAX ke dalam fail kecil Berikut ialah contoh mudah:

#!/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)

Hasil keluaran di atas ialah :

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 dan Ruby

Kita boleh menggunakan XPath untuk melihat XML XPath ialah bahasa untuk mencari maklumat dalam dokumen XML (lihat: tutorial XPath).

XPath ialah bahasa laluan XML, iaitu bahasa yang digunakan untuk menentukan lokasi bahagian tertentu dokumen XML (subset daripada Standard Universal Markup Language). XPath adalah berdasarkan struktur pepohon XML dan menyediakan keupayaan untuk mencari nod dalam pepohon struktur data.

Ruby menyokong XPath melalui kelas XPath REXML, iaitu penghuraian berasaskan pepohon (Model Objek Dokumen).

#!/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

Hasil keluaran contoh di atas ialah:

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

XSLT dan Ruby

Terdapat dua penghurai XSLT dalam Ruby Penerangan ringkas diberikan di bawah:

Ruby-Sablotron

Penghurai ini Ditulis. dan diselenggara oleh Hakim Masayoshi Takahash. Ini ditulis terutamanya untuk sistem pengendalian Linux dan memerlukan perpustakaan berikut:

  • Sablot

  • Iconv

  • Expat

Anda boleh menemui perpustakaan ini dalam Ruby-Sablotron.

XSLT4R

XSLT4R yang ditulis oleh Michael Neumann. XSLT4R digunakan untuk interaksi baris arahan yang mudah dan boleh digunakan oleh aplikasi pihak ketiga untuk mengubah dokumen XML.


XSLT4R memerlukan operasi XMLScan dan termasuk arkib XSLT4R, iaitu modul 100% Ruby. Modul ini boleh dipasang menggunakan kaedah pemasangan Ruby standard (iaitu Ruby install.rb).

Format sintaks XSLT4R adalah seperti berikut:

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

Jika anda ingin menggunakan XSLT4R dalam aplikasi anda, anda boleh memperkenalkan XSLT dan masukkan parameter yang anda perlukan. Contohnya adalah seperti berikut:

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 )

Untuk maklumat lanjut

  • Untuk penghurai REXML yang lengkap, sila lihat dokumentasi dokumentasi penghurai REXML.


  • Anda boleh memuat turun XSLT4R daripada Pangkalan Pengetahuan RAA .