在 Ruby 中,处理 XML 数据以及使用 XSLT(可扩展样式表语言转换)和 XPath(XML 路径语言)是通过一些专门的库来完成的。常见的库有 NokogiriREXML。这篇教程将介绍如何使用这些库来解析 XML 文件、应用 XSLT 转换、以及使用 XPath 查询 XML 文档。


📌 目录

  1. 🔹 什么是 XML、XSLT 和 XPath?
  2. 🔹 使用 Ruby 处理 XML
  3. 🔹 使用 Nokogiri 解析和生成 XML
  4. 🔹 使用 XPath 查询 XML
  5. 🔹 使用 XSLT 转换 XML
  6. 🔹 示例代码:XML 解析和查询
  7. 🔹 常见问题
  8. 🔹 参考资料

🔹 什么是 XML、XSLT 和 XPath?

  • XML(可扩展标记语言):一种用于表示结构化数据的文本格式,广泛用于数据交换和存储。XML 文件使用标签(如 <name>, <age>)来组织数据。
  • XSLT(可扩展样式表语言转换):一种用于转换 XML 文档的语言。通过 XSLT,可以将 XML 数据转换为不同的格式,如 HTML、文本等。
  • XPath(XML 路径语言):用于在 XML 文档中查找信息的语言。XPath 允许通过路径表达式从 XML 文档中提取数据。

🔹 使用 Ruby 处理 XML

Ruby 提供了多种方式来处理 XML 文件。最常用的两个库是:

  1. Nokogiri:一个高性能、功能强大的 XML 和 HTML 解析库,支持 XPath 和 XSLT。
  2. REXML:Ruby 内置的 XML 解析库,但功能相对简单。

本教程将主要介绍 Nokogiri,它是 Ruby 中最常用的 XML 处理库。


🔹 使用 Nokogiri 解析和生成 XML

1. 安装 Nokogiri

gem install nokogiri

2. 解析 XML 文件

使用 Nokogiri::XML 方法可以轻松解析 XML 文件并生成一个可以查询和操作的文档对象。

require 'nokogiri'

xml_data = <<-XML
<person>
  <name>John Doe</name>
  <age>30</age>
</person>
XML

doc = Nokogiri::XML(xml_data)
puts doc.xpath('//name').text  # 输出:John Doe
puts doc.xpath('//age').text   # 输出:30

在上面的代码中:

  • Nokogiri::XML(xml_data) 解析 XML 数据并生成一个 Nokogiri 对象。
  • xpath('//name') 用于查询 XML 文档中 <name> 标签的值。

3. 创建和生成 XML

Nokogiri 还支持生成和修改 XML 数据。你可以通过 Nokogiri::XML::Builder 来构建 XML 文档。

require 'nokogiri'

xml_doc = Nokogiri::XML::Builder.new do |xml|
  xml.person {
    xml.name 'John Doe'
    xml.age '30'
  }
end

puts xml_doc.to_xml

输出:

<?xml version="1.0"?>
<person>
  <name>John Doe</name>
  <age>30</age>
</person>

4. 修改 XML 数据

你可以使用 xpath 查找 XML 元素,并对它们进行修改。

require 'nokogiri'

xml_data = <<-XML
<person>
  <name>John Doe</name>
  <age>30</age>
</person>
XML

doc = Nokogiri::XML(xml_data)
doc.xpath('//name').first.content = 'Jane Doe'  # 修改姓名
puts doc.to_xml

输出:

<?xml version="1.0"?>
<person>
  <name>Jane Doe</name>
  <age>30</age>
</person>


🔹 使用 XPath 查询 XML

XPath 是一种用于查找 XML 文档中数据的语言。你可以使用 xpath 方法在 Ruby 中执行 XPath 查询。

1. 简单查询

查询所有 <name> 元素:

doc.xpath('//name').each do |name|
  puts name.text  # 输出所有 name 元素的文本内容
end

2. 查询带有条件的元素

查询所有年龄大于 25 的人:

doc.xpath('//person[age > 25]').each do |person|
  puts person.xpath('name').text
end

3. 查询特定属性的元素

查询具有特定属性的元素:

xml_data = <<-XML
<person id="1">
  <name>John Doe</name>
  <age>30</age>
</person>
XML

doc = Nokogiri::XML(xml_data)
puts doc.xpath('//person[@id="1"]/name').text  # 输出:John Doe


🔹 使用 XSLT 转换 XML

XSLT 允许你将 XML 文档转换为其他格式,如 HTML 或纯文本。Ruby 的 Nokogiri 支持 XSLT 转换,可以帮助你轻松实现这个过程。

1. 创建 XSLT 样式表

首先,创建一个 XSLT 样式表,这个样式表定义了如何转换 XML 数据。

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h1>Person Info</h1>
        <p>Name: <xsl:value-of select="person/name"/></p>
        <p>Age: <xsl:value-of select="person/age"/></p>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

2. 使用 Nokogiri 应用 XSLT

require 'nokogiri'

xml_data = <<-XML
<person>
  <name>John Doe</name>
  <age>30</age>
</person>
XML

xslt_data = <<-XSLT
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h1>Person Info</h1>
        <p>Name: <xsl:value-of select="person/name"/></p>
        <p>Age: <xsl:value-of select="person/age"/></p>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
XSLT

xml_doc = Nokogiri::XML(xml_data)
xslt_doc = Nokogiri::XSLT(xslt_data)

result = xslt_doc.transform(xml_doc)
puts result.to_html

输出:

<html>
  <body>
    <h1>Person Info</h1>
    <p>Name: John Doe</p>
    <p>Age: 30</p>
  </body>
</html>

在上面的代码中,Nokogiri::XSLT 解析 XSLT 样式表,并使用 transform 方法将 XML 数据转换为 HTML。


🔹 常见问题

1. 如何处理大型 XML 文件?

使用 Nokogiri 的流式解析功能,可以处理大型 XML 文件而不将整个文件加载到内存中。

Nokogiri::XML::Reader(File.open('large_file.xml')).each do |node|
  puts node.name
end

2. 如何处理 XML 命名空间?

当 XML 中使用命名空间时,XPath 查询会需要使用命名空间的前缀。

doc.xpath('//xmlns:name', xmlns: 'http://www.example.com').each do |node|
  puts node.text
end


🔹 参考资料


总结

  • XML 是一种常见的用于数据表示的格式,Ruby 提供了强大的库(如 Nokogiri)来解析和处理 XML 数据。
  • XPath 允许你在 XML 文档中查询并提取数据。
  • XSLT 是一种强大的工具,可以将 XML 文档转换为其他格式,如 HTML。
  • 使用 Nokogiri,你可以非常容易地解析、查询和转换 XML 文档,支持 XPath 和 XSLT 转换。

💡 通过学习 Ruby 中的 XML 相关库,你可以高效地处理和转换各种格式的数据,应用于 Web 服务、数据交换等领域。