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 Coderequire '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 Coderequire '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 Coderequire '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 Coderequire '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 Coderequire '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 Coderequire '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 的简介和使用方法。希望能对您有所帮助。