Рубин 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 )
Более подробная информация
- Полная REXML анализатор, обратитесь к документации REXML документа анализатор .
- Вы можете начать с RAA знаний скачать XSLT4R в.