Latest web development tutorials

Рубин XML, XSLT и XPath Учебное пособие

Что такое XML?

Это относится к Extensible Markup Language XML (Extensible Markup Language).

Extensible Markup Language, подмножество Стандартный обобщенный язык разметки, способ маркировки электронного документа, чтобы иметь структурированный язык разметки.

Он может быть использован для пометки данных, определения типов данных, это технология, которая позволяет пользователям определять свой собственный язык исходного языка разметки. Он идеально подходит для веб-передачи, обеспечивая единый подход к описанию и обмена независимым от приложений или поставщиков структурированных данных.

Для получения дополнительной информации, пожалуйста , см наш XML учебник


XML-анализатор и структура API

XML-парсер SAX и DOM в основном два вида.

  • SAX парсер обработки событий на основе, сканирование XML-документ должен от начала до конца снова, в процессе сканирования, каждый раз испытывает грамматическую структуру, он будет вызывать обработчик события специфическую грамматическую структуру, отправить заявку событие.
  • DOM Document Object Model анализ, иерархическая конструкция грамматическая структура документа, создать DOM дерево в памяти узла DOM дерева в качестве объекта для идентификации, документ разбора Вэньчэн, весь DOM дерево документа в памяти.

Руби для разбора и создания XML

РУБИН разбор XML-документов могут использовать эту библиотеку библиотеку REXML.

библиотека REXML представляет собой XML-инструментарий рубин использовать чистый Ruby, язык, следовать XML1.0 норм.

В ruby1.8 и более поздних версий, библиотека будет содержать рубинового REXML.

Путь к библиотеке REXML является: REXML / документ

Все методы и классы упакованы в модуль REXML.

REXML анализатор имеет следующие преимущества по сравнению с другими анализаторами:

  • 100% написан Ruby.
  • Применимо к SAX и DOM-парсер.
  • Он легкий, менее 2000 строк кода.
  • Легко понять методы и классы.
  • На основе SAX2 API и полная поддержка XPath.
  • Используйте установку Ruby, не требуя отдельных установок.

Ниже приведен пример кода XML, сохранить его как 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>

DOM парсер

Давайте начнем с разбора данных XML Сначала мы ввели библиотеку REXML / документ, мы обычно можем быть в пространстве имен REXML верхнего уровня, введенного:

#!/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 и Руби

Мы можем использовать XPath для просмотра XML, XPath для поиска информации является документ на языке XML (См: XPath Учебное пособие ).

XPath является XML Path Language, это метод, используемый для определения XML (подмножество языка разметки Стандартный обобщенный язык документа) часть местоположения. XPath на основе XML-дерева, а также предоставляет возможность искать в структуре данных узлов в дереве.

Руби XPath поддержки XPath классом REXML, который основан на дереве анализа (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

В приведенном выше примере выход:

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

XSLT и Руби

Рубин имеет два XSLT-анализатор, краткое описание приводится ниже:

Рубин-Sablotron

Этот анализатор написан и поддерживается справедливость Масаеси Takahash. Это в основном написана для операционной системы Linux, вам нужны следующие библиотеки:

  • Sablot
  • Iconv
  • эмигрант

Вы можете Руби-Sablotron найти эти библиотеки.

XSLT4R

XSLT4R написанная Майклом Нейман. XSLT4R для простого взаимодействия командной строки, сторонние приложения могут быть использованы для преобразования XML-документов.

XSLT4R нужны XMLScan операции, в том числе архив XSLT4R, который представляет собой модуль 100% Руби. Эти модули могут использовать стандартный Ruby, метод установки (т.е. install.rb Ruby) установки.

Синтаксис 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 )

Более подробная информация