跳转到内容

Ruby 编程/XML 处理/REXML

来自维基教科书,开放世界中的开放书籍

REXML 是一个 XML 处理 API。从 Ruby 1.8 开始,它被包含在标准 API 中。

REXML 可以读取和写入 XML 文档。针对 DTD 或模式的验证尚未完全实现。

还存在强大的 XML 解析 gem,例如 nokogiri 和 hpricot gem。它们通常比 REXML 运行得更快。

使用 DOM API,REXML 可以解析文档并构建一个包含元素属性文本的树。

例如,这可能用于保存维基教科书

 <wikibook title="Programming:Ruby">
   <section title="Getting started">
     <chapter title="Overview">Ruby is a programming language of the Perl and Python ilk; [...]
     </chapter>
   </section>
 </wikibook>

在这种情况下,chapter 是一个元素。它有一个属性title,其Overview,还有一个文本,其为“Ruby 是一种编程语言 [...]”。

section 也是一个元素。它也有一个属性,但没有文本。相反,它有一个元素,chapter 元素。

简而言之,元素可以有属性、文本和子元素。

REXML 中的表示

[编辑 | 编辑源代码]

解析 XML 文档时,会创建一个 REXML::Document 类的实例。(REXML::Documentnew 消息只需要用 REXML::Document 本身、StringIO 来馈送。)这代表整个文档,包括<?xml...?> 标签。REXML::Document 本身是REXML::Element 的子类,这是一个重要的类。

使用 DOM 时,Element 类的实例表示 XML 文档的元素。它们可能具有属性(使用 attributes 消息访问)、文本和子元素。

Document 本身就是一个 Element,但通常情况下,你可能更感兴趣的是 XML 文档的根元素。正如 XML 规范中定义的那样,任何文档都只有一个根元素;它可以很容易地通过调用 REXML::Document.root() 获取。

一旦获得了根 Element,就可以使用 Element 中定义的 elements 消息(它返回所有子元素的集合)向下遍历树,或者访问属性或文本,无论你需要的什么。

树也可以被修改。此外,to_s 方法已被重写,以返回元素、属性和文本的 XML 代码。Element.to_s 返回整个元素的 XML 代码,包括属性、文本和子元素的 XML 代码。你也可以在 Document 上调用它。

[编辑 | 编辑源代码]

ruby-doc.org 上的标准 API 文档,包括 rexml 包

华夏公益教科书