📅  最后修改于: 2023-12-03 15:27:56.230000             🧑  作者: Mango
XML是一种可扩展标记语言,它可以被用于描述数据。XML被广泛地应用于 Web 式应用程序。XML是纯文本文档,它可以被很多不同类型的计算机处理。
在 XML 语言中,元素被定义为被开始标签和结束标签所包围的一段数据。而每个元素都可以包含上百种不同类型的属性。
在 Ruby 程序员中,XML 是一种非常常见的数据格式,因此,了解如何解析和处理 XML 是非常重要的。
Ruby 提供了许多解析 XML 的方式。除了 Ruby 标准库中自带的 REXML 和 XMLParser 外,RubyGems 还有许多其他解析 XML 的 Gem。
在本篇文章中,我们主要介绍 Ruby 标准库中自带的两种方式:
REXML 是 Ruby 标准库中自带的解析 XML 的库。通过 REXML,我们可以创建一个 XML 文档对象,然后对该文档对象进行操作,比如查找元素、修改元素、删除元素等等。
REXML 中最常用的类是 Document、Element 和 Attribute。接下来我们将介绍这些类的用法和示例:
Document 类是 REXML 中最核心的类,它表示一个 XML 文档。我们可以通过下面的代码创建一个 Document 对象:
require 'rexml/document'
xml = %{
<root>
<book>
<title>Programming Ruby</title>
<author>David Thomas, Andrew Hunt</author>
</book>
<book>
<title>Practical Object-Oriented Design</title>
<author>Sandi Metz</author>
</book>
</root>
}
doc = REXML::Document.new(xml)
上述代码中,我们首先使用 %{} 定义了一段 XML 文本,该 XML 文本包含两本书的信息。然后使用 REXML::Document.new 方法创建了一个 Document 对象。
Element 类表示 XML 中的一个元素。我们可以通过 Document 对象找到该元素,对这个元素进行修改、删除等操作。
通过 REXML::XPath 语法,我们可以方便地查找 XML 中的元素。比如,下面的代码可以查找所有的 book 元素:
elements = REXML::XPath.match(doc, '//book')
上述代码中,我们使用 REXML::XPath.match 方法查找所有的 book 元素。
然后我们遍历 elements,对每个元素进行操作。比如,我们可以使用下面的代码打印每本书的标题和作者:
elements.each do |el|
title = REXML::XPath.first(el, 'title').text
author = REXML::XPath.first(el, 'author').text
puts "#{title} by #{author}"
end
上述代码中,我们使用 REXML::XPath.first 方法找到 title 和 author 元素,并获取它们的文本值。
Attribute 类表示 XML 元素的一个属性。我们可以通过 Element 对象获取该元素的属性并对其进行修改、删除等操作。
比如,下面的代码可以获取第一本书的 title 属性:
title = REXML::XPath.first(doc, '//book[1]/title').attributes['lang']
上述代码中,我们使用 REXML::XPath.first 方法找到第一本书的 title 元素,并获取它的 lang 属性值。
XMLParser 是 Ruby 标准库中另一种解析 XML 的方式。相对于 REXML,XMLParser 更为轻量级,非常适合处理小型 XML 文件。
在 XMLParser 中,我们可以使用 XML::Parser.parse_string 方法解析 XML 文本,也可以使用 XML::Parser.parse_file 方法解析 XML 文件。
XML 中最常用的类是 XML::Document、XML::Node 和 XML::Attr。接下来我们将介绍这些类的用法和示例:
XML::Document 类表示一个 XML 文档。我们可以通过 XML::Document 对象查找、修改、删除元素。
require 'xml'
xml = %{
<root>
<book>
<title lang="en">Programming Ruby</title>
<author>David Thomas, Andrew Hunt</author>
</book>
<book>
<title lang="en">Practical Object-Oriented Design</title>
<author>Sandi Metz</author>
</book>
</root>
}
doc = XML::Parser.parse_string(xml).document
上述代码中,我们首先使用 %{} 定义了一段 XML 文本,然后使用 XML::Parser.parse_string 方法创建了一个 XML::Document 对象。
XML::Node 类表示 XML 中的一个节点。我们可以通过 XML::Document 对象找到该节点,对这个节点进行修改、删除等操作。
下面的代码可以找到第一本书的 title 元素,并打印它的文本值和 lang 属性值:
title = doc.root.elements['book/title'].text
lang = doc.root.elements['book/title'].attributes['lang']
puts "#{title} (#{lang})"
上述代码中,我们使用 doc.root.elements['xpath'] 方法找到 title 元素,然后使用 text 和 attributes['name'] 方法获取元素的文本值和指定属性的值。
XML::Attr 类表示一个 XML 元素的属性。我们可以通过 XML::Node 对象获取该元素的属性并对其进行修改、删除等操作。
比如,下面的代码可以修改第一本书的 title 元素的 lang 属性值:
doc.root.elements['book[1]/title'].attributes['lang'] = 'zh'
上述代码中,我们使用 doc.root.elements['xpath'].attributes['name'] 方法获取元素的指定属性的值,并赋值为 'zh'。
在 Ruby 中,我们可以使用 REXML 和 XMLParser 两种方式解析 XML。REXML 更为强大,适合处理大型 XML 文件,而 XMLParser 更为轻量级,适合处理小型 XML 文件。
无论是使用哪种方式,对 XPath 语法的熟练应用都是非常重要的。XPath 是一种能够让我们快速找到 XML 中指定元素的语法,学会使用它可以极大地提高我们处理 XML 的效率。