Latest web development tutorials

Rubí XML, XSLT y XPath Tutorial

¿Qué es XML?

Se refiere al lenguaje de marcado extensible XML (eXtensible Markup Language).

Extensible Markup Language, un subconjunto del lenguaje de marcado generalizado estándar, un método para marcar un documento electrónico para tener un lenguaje de marcado estructurado.

Puede ser utilizado para identificar datos, la definición de tipos de datos, es una tecnología que permite a los usuarios definir su propio idioma fuente de lenguaje de marcas. Es ideal para la transmisión Web, proporcionando un enfoque unificado para describir e intercambiar independiente de las aplicaciones o los proveedores de datos estructurados.

Para obtener más información, consulte nuestro tutorial XML


analizador de XML y la estructura de la API

XML parser SAX y DOM son principalmente dos tipos.

  • analizador SAX es el procesamiento basado en eventos, el escaneo de documentos XML necesita de principio a fin una vez más, en el proceso de exploración, cada vez que experimenta una estructura gramatical, se llamará a la estructura gramatical específica controlador de eventos, enviar la solicitud un evento.
  • El análisis del modelo de objetos de documento DOM, construcción jerárquica estructura gramatical del documento, establecer árbol DOM en el nodo del árbol DOM memoria como un objeto de identificar, analizar el documento Wencheng, todo el árbol DOM documentará en la memoria.

Ruby a analizar y crear XML

RUBY análisis de documentos XML se puede utilizar esta biblioteca REXML biblioteca.

REXML biblioteca es un conjunto de herramientas XML rubí es utilizar lenguaje Ruby puro, seguir las normas XML1.0.

En ruby1.8 y versiones posteriores, la biblioteca contendrá RUBY REXML.

REXML vía de la biblioteca es: rexml / documento

Todos los métodos y clases se empaquetan en un módulo REXML.

analizador REXML tiene las siguientes ventajas sobre otros programas de análisis:

  • 100% escrito por Ruby.
  • Aplicable a Sax y analizador DOM.
  • Es ligero, menos de 2000 líneas de código.
  • Fácil de entender los métodos y clases.
  • API de SAX2 En base y el apoyo completo de XPath.
  • Utilizar la instalación de Ruby, sin requerir instalaciones separadas.

El siguiente es un ejemplo de código XML, guárdelo como 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>

analizador DOM

Vamos a empezar a analizar los datos XML En primer lugar hemos introducido biblioteca rexml / documento, por lo general podemos estar en el espacio de nombres REXML de nivel superior introducido:

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

La salida del ejemplo anterior es:

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:

analizador SAX

El procesamiento de la misma fichero de datos: movies.xml, análisis SAX no se recomienda como un pequeño archivo, el siguiente es un ejemplo sencillo:

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

Por encima de salida es:

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

Podemos utilizar XPath para ver XML, XPath para encontrar la información es un documento en lenguaje XML (Ver: XPath Tutorial ).

XPath es el XML Path Language, es un método utilizado para determinar el XML (un subconjunto del lenguaje de marcado generalizado estándar) lenguaje del documento una parte de la ubicación. árbol XML XPath de base, y proporciona la capacidad de buscar en los nudos de la estructura de datos en el árbol.

apoyo XPath XPath de Ruby por clase REXML, que se basa en el árbol de análisis (Document Object Model).

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

La salida del ejemplo anterior es:

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

XSLT y Ruby

Ruby tiene dos analizador XSLT, una breve descripción es la siguiente:

Rubí-Sablotron

Este analizador está escrito y mantenido por la justicia Masayoshi Takahash. Esto está escrito principalmente para el sistema operativo Linux, necesita las siguientes bibliotecas:

  • Sablot
  • iconv
  • Expat

Puede Rubí-Sablotron encontrar estas bibliotecas.

XSLT4R

XSLT4R escrito por Michael Neumann. XSLT4R para la interacción sencilla línea de comandos, las aplicaciones de terceros puede ser utilizado para transformar documentos XML.

XSLT4R necesita operación XMLScan, incluyendo archivo XSLT4R, que es un módulo de Ruby 100%. Estos módulos pueden utilizar el método estándar de instalación de Ruby (es decir install.rb rubí) de la instalación.

sintaxis XSLT4R es el siguiente:

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

Si desea utilizar XSLT4R en su aplicación, puede introducir parámetros XSLT y de entrada que necesita. Ejemplos son los siguientes:

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 )

más información