Ruby XML, XSLT 和 XPath 教程

  什么是 XML ?

  XML 指可扩展标记语言(eXtensible Markup Language)。

  可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。

  它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。

  更多内容请查看我们的 XML 教程

  XML解析器结构和API

  XML的解析器主要有DOM和SAX两种。

  SAX解析器是基于事件处理的,需要从头到尾把XML文档扫描一遍,在扫描的过程中,每次遇到一个语法结构时,就会调用这个特定语法结构的事件处理程序,向应用程序发送一个事件。

  DOM是文档对象模型解析,构建文档的分层语法结构,在内存中建立DOM树,DOM树的节点以对象的形式来标识,文档解析文成以后,文档的整个DOM树都会放在内存中。

  Ruby 中解析及创建 XML

  RUBY中对XML的文档的解析可以使用这个库REXML库。

  REXML库是ruby的一个XML工具包,是使用纯Ruby语言编写的,遵守XML1.0规范。

  在Ruby1.8版本及其以后,RUBY标准库中将包含REXML。

  REXML库的路径是: rexml/document

  所有的方法和类都被封装到一个REXML模块内。

  REXML解析器比其他的解析器有以下优点:

  100% 由 Ruby 编写。

  可适用于 SAX 和 DOM 解析器。

  它是轻量级的,不到2000行代码。

  很容易理解的方法和类。

  基于 SAX2 API 和完整的 XPath 支持。

  使用 Ruby 安装,而无需单独安装。

  以下为实例的 XML 代码,保存为movies.xml:

  

  

  War, Thriller

  DVD

  2003

  PG

  10

  Talk about a US-Japan war

  

  

  Anime, Science Fiction

  DVD

  1989

  R

  8

  A schientific fiction

  

  

  Anime, Action

  DVD

  4

  PG

  10

  Vash the Stampede!

  

  

  Comedy

  VHS

  PG

  2

  Viewable boredom

  

  

  DOM 解析器

  让我们先来解析 XML 数据,首先我们先引入 rexml/document 库,通常我们可以将 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 和 Ruby

  我们可以使用XPath来查看XML ,XPath 是一门在 XML 文档中查找信息的语言(查看:XPath 教程)。

  XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。

  Ruby 通过 REXML 的 XPath 类支持 XPath,它是基于树的分析(文档对象模型)。

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

  以上实例输出结果为:

   ...

  War, Thriller

  Anime, Science Fiction

  Anime, Action

  Comedy

  ["DVD", "DVD", "DVD", "VHS"]

  XSLT 和 Ruby

  Ruby 中有两个 XSLT 解析器,以下给出简要描述:

  Ruby-Sablotron

  这个解析器是由正义Masayoshi Takahash编写和维护。这主要是为Linux操作系统编写的,需要以下库:

  Sablot

  Iconv

  Expat

  你可以在 Ruby-Sablotron 找到这些库。

  XSLT4R

  XSLT4R 由 Michael Neumann 编写。 XSLT4R 用于简单的命令行交互,可以被第三方应用程序用来转换XML文档。

  XSLT4R需要XMLScan操作,包含了 XSLT4R 归档,它是一个100%的Ruby的模块。这些模块可以使用标准的Ruby安装方法(即Ruby install.rb)进行安装。

  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 )

  (编辑:雷林鹏 来源:网络)

雷林鹏分享:Ruby XML, XSLT 和 XPath 教程的更多相关文章

  1. 雷林鹏分享:使用 XSLT 显示 XML

    使用 XSLT 显示 XML 通过使用 XSLT,您可以把 XML 文档转换成 HTML 格式. 使用 XSLT 显示 XML XSLT 是首选的 XML 样式表语言. XSLT(eXtensible ...

  2. 雷林鹏分享:XML 相关技术

    XML 相关技术 下面是一个 XML 技术的列表. XHTML (可扩展 HTML) 更严格更纯净的基于 XML 的 HTML 版本. XML DOM (XML 文档对象模型) 访问和操作 XML 的 ...

  3. 雷林鹏分享:XML 编辑器

    XML 编辑器 如果您希望极认真地学习和使用 XML,那么您一定会从一款专业的 XML 编辑器的使用上受益. XML 是基于文本的 XML 是基于文本的标记语言. 关于 XML 的一件很重要的事情是, ...

  4. 雷林鹏分享:XML 命名空间

    XML 命名空间 XML 命名空间提供避免元素命名冲突的方法. 命名冲突 在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突. 这个 XML 携带 HTML ...

  5. 雷林鹏分享:XML - E4X

    XML - E4X E4X 向 JavaScript 添加了对 XML 的直接支持. E4X 实例 var employees= Tove 32 Jani 26 ; document.write(em ...

  6. 雷林鹏分享:XML 实例

    XML 实例 这些例子演示了 XML 文件.XML 格式化和 XML 转换(XSLT). 还演示了与 XML 一起使用的 JavaScript(AJAX). 查看 XML 文件 查看一个简单的 XML ...

  7. 雷林鹏分享:XML 总结 下一步学习什么呢?

    XML 总结 下一步学习什么呢? XML 总结 XML 可用于交换.共享和存储数据. XML 文档形成 树状结构,在"根"和"叶子"的分支机构开始的. XML ...

  8. 雷林鹏分享:XML 简介

    XML 简介 XML 被设计用来传输和存储数据. HTML 被设计用来显示数据. 应该掌握的基础知识 在您继续学习之前,需要对以下知识有基本的了解: HTML JavaScript 如果您希望首先学习 ...

  9. 雷林鹏分享:XML 教程

    XML 教程 XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据. XML 很重要,也很容易学习. 现在开始学习 XML! XML 文 ...

随机推荐

  1. java利用poi 把ppt转化为图片,

    导入jar包: poi-3.8.jar poi-ooxml-3.9.jar poi-scratchpad-3.8.jar 代码: package test4; import java.awt.Dime ...

  2. 【巷子】---vue路由懒加载---【vue】

    一.懒加载 也叫延迟加载或者按需加载,即在需要的时候进行加载,   二.为什么要使用懒加载 像vue这种单页面应用,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要 ...

  3. Docker企业级仓库Harbor的安装配置与使用

    Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源Docker Distribution.作为一个企业级 ...

  4. Database Sharding, The “Shared-Nothing” Approach DATABASE SHARDING

    w将单个服务器上的单个数据库打碎为多个服务器上的单个数据库 http://www.agildata.com/database-sharding/ Database Sharding provides ...

  5. Python开发【Tornado】:简介与使用

    Tornado框架 简介: Tornado是使用Python编写的一个强大的.可扩展的Web服务器.它在处理严峻的网络流量时表现得足够强健,但却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和 ...

  6. Flask系列之蓝图中使用动态URL前缀

    让我们先来看一个简单的例子,假设有下面这样一个蓝图(是关于用户主页的): from flask import Blueprint, render_template profile = Blueprin ...

  7. CentOS7系统上部署.net core程序

    一.准备工作 首先安装 xshell 和 xftp ,前者用于SSH连接Linux服务器,后者用于FTP上传下载文件. xshell和xftp个人使用是免费的,下载地址 之后分别输入用户名和密码登录主 ...

  8. The same month as the adidas NMD Singapore is releasing

    Earlier this December 2017, the inaugural adidas NMD Singapore silhouette released in the first colo ...

  9. 2.4 The Object Model -- Computed Properties and Aggregate Data with @each(计算的属性和使用@each聚合数据)

    1. 通常,你可能有一个计算的属性依赖于数组中的所有元素来确定它的值.例如,你可能想要计算controller中所有todo items的数量,以此来确定完成了多少任务. export default ...

  10. Qt工程文件说明

    Qt工程文件说明 2017-10-16  天天快乐6...  转自 LZS2851 修改   微信 分享: 这篇文章是我从360doc上转的,本来是要把转的url列出来的,但是它们居然禁掉了复制,而且 ...