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 .