Ruby XML, XSLT 和 XPath 教程学习笔记

XML 简介

XML(可扩展标记语言)是一种与 HTML 类似的标记语言。它被用于存储和传输数据,它的语法规则十分严格。XML 文件包含标签、属性、实体和注释等元素,可以用于描述任何类型的数据。

下面是一个简单的 XML 示例:

xmlCopy Code
<?xml version="1.0" encoding="UTF-8"?> <book> <title>Ruby 教程</title> <author>binjie09</author> <pub_year>2023</pub_year> </book>

Ruby 中的 XML 解析

Ruby 中提供了多种解析 XML 的方法,常用的有 REXML 和 Nokogiri 两个库。

REXML

REXML 是 Ruby 标准库中内置的一个 XML 解析库。它使用纯 Ruby 实现,无需第三方库支持,但其性能较差。

下面是 REXML 解析以上示例 XML 的代码:

rubyCopy Code
require 'rexml/document' xml_str = <<-XML <?xml version="1.0" encoding="UTF-8"?> <book> <title>Ruby 教程</title> <author>binjie09</author> <pub_year>2023</pub_year> </book> XML doc = REXML::Document.new(xml_str) puts doc.elements['book/title'].text # 输出:Ruby 教程

Nokogiri

Nokogiri 是用于解析 HTML 和 XML 文档的 Ruby 常见库之一。它使用 C 库 LibXML2 实现,因此在性能上有很大优势。

下面是 Nokogiri 解析以上示例 XML 的代码:

rubyCopy Code
require 'nokogiri' xml_str = <<-XML <?xml version="1.0" encoding="UTF-8"?> <book> <title>Ruby 教程</title> <author>binjie09</author> <pub_year>2023</pub_year> </book> XML doc = Nokogiri::XML(xml_str) puts doc.at('book title').text # 输出:Ruby 教程

XSLT 简介

XSLT(可扩展样式表语言转换)是一种用于将 XML 转换为其他格式(如 HTML、CSS、XHTML 等)的语言。XSLT 文件包含了一组模板规则,这些规则用于指定如何将输入文档转换为输出文档。

下面是一个简单的 XSLT 示例:

xmlCopy Code
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Books</title> </head> <body> <h1>Books</h1> <ul> <xsl:for-each select="catalog/book"> <li> <xsl:value-of select="title"/> <xsl:text> by </xsl:text> <xsl:value-of select="author"/> </li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet>

Ruby 中的 XSLT 转换

Ruby 提供了两个库用于将 XML 转换为其他格式,分别是 REXML 和 Nokogiri。

REXML

REXML 提供了一个用于将 XML 转换为 HTML 的转换器。它可以使用 XSLT 文件作为转换模板。

下面是使用 REXML 将 XML 转换为 HTML 的示例代码:

rubyCopy Code
require 'rexml/document' require 'rexml/xslt' xml_str = <<-XML <?xml version="1.0" encoding="UTF-8"?> <catalog> <book> <title>Ruby 教程</title> <author>binjie09</author> </book> <book> <title>Python 教程</title> <author>binjie09</author> </book> </catalog> XML xslt_str = <<-XSLT <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Books</title> </head> <body> <h1>Books</h1> <ul> <xsl:for-each select="catalog/book"> <li> <xsl:value-of select="title"/> <xsl:text> by </xsl:text> <xsl:value-of select="author"/> </li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet> XSLT xml_doc = REXML::Document.new(xml_str) xslt_doc = REXML::Document.new(xslt_str) transformer = REXML::XSLT::Transformer.new(xslt_doc) result_doc = transformer.transform(xml_doc) puts result_doc.to_s

Nokogiri

Nokogiri 使用的是 LibXSLT 库来实现 XSLT 转换。它提供了一个 XSLTProcessor 类,用于执行转换。

以下是使用 Nokogiri 进行 XSLT 转换的示例代码:

rubyCopy Code
require 'nokogiri' require 'open-uri' xml_str = <<-XML <?xml version="1.0" encoding="UTF-8"?> <catalog> <book> <title>Ruby 教程</title> <author>binjie09</author> </book> <book> <title>Python 教程</title> <author>binjie09</author> </book> </catalog> XML xslt_str = <<-XSLT <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head> <title>Books</title> </head> <body> <h1>Books</h1> <ul> <xsl:for-each select="catalog/book"> <li> <xsl:value-of select="title"/> <xsl:text> by </xsl:text> <xsl:value-of select="author"/> </li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet> XSLT xml_doc = Nokogiri::XML(xml_str) xslt_doc = Nokogiri::XSLT(xslt_str) result_doc = xslt_doc.transform(xml_doc) puts result_doc.to_html

XPath 简介

XPath 是一种用于在 XML 文档中选取节点的语言。它使用路径表达式来选取节点,这些表达式类似于文件系统中的路径。

下面是一个简单的 XPath 表达式:

xmlCopy Code
/catalog/book[author='binjie09']/title

这个表达式会选取所有作者为 binjie09 的书籍标题。

Ruby 中的 XPath 查询

Ruby 中的 REXML 和 Nokogiri 都支持使用 XPath 查询 XML 文档。

以下是使用 REXML 进行 XPath 查询的示例代码:

rubyCopy Code
require 'rexml/document' require 'rexml/xpath' xml_str = <<-XML <?xml version="1.0" encoding="UTF-8"?> <catalog> <book> <title>Ruby 教程</title> <author>binjie09</author> </book> <book> <title>Python 教程</title> <author>binjie09</author> </book> </catalog> XML doc = REXML::Document.new(xml_str) XPath.each(doc, "/catalog/book[author='binjie09']/title") do |title| puts title.text end

以下是使用 Nokogiri 进行 XPath 查询的示例代码:

rubyCopy Code
require 'nokogiri' xml_str = <<-XML <?xml version="1.0" encoding="UTF-8"?> <catalog> <book> <title>Ruby 教程</title> <author>binjie09</author> </book> <book> <title>Python 教程</title> <author>binjie09</author> </book> </catalog> XML doc = Nokogiri::XML(xml_str) doc.xpath("/catalog/book[author='binjie09']/title").each do |title| puts title.text end

以上就是 Ruby 中 XML、XSLT 和 XPath 的简介和使用方法。希望能对您有所帮助。