首页 > 学院 > 开发设计 > 正文

Ruby中XML格式数据处理库REXML的使用方法指南

2019-10-26 19:29:06
字体:
来源:转载
供稿:网友

以树方式使用 REXML
REXML 的目的是 正好够用。在最大程度上,它能很好地完成任务。 实际上, REXML 支持两种不同样式的 XML 处理 ― “树”和“流”。 第一种样式是 DOM 所尝试要做的更简单的版本;第二种样式是 SAX 所尝试要做的更简单的版本。 让我们先研究树样式。假设我们要提取上一个示例中的同一个地址簿文档。 下面的示例来自我所创建的经修改的 eval.rb ; 标准 eval.rb (链接到 Ruby 教程)可以根据对复杂对象的表达式求值显示非常长的计算结果 ― 我的 eval.rb 在没有错误发生的情况下不作出反应:
如何使用 REXML 来引用嵌套数据

ruby> require "rexml/document"ruby> include REXMLruby> addrbook = (Document.new File.new "address.xml").rootruby> persons = addrbook.elements.to_a("//person")ruby> puts persons[1].elements["address"].attributes["city"]New York

这个表达式很普通。 .to_a() 方法创建文档中所有 <person> 元素的数组,在其它命名中它可能是有用的。 元素有点象 DOM 节点,但它其实更接近于 XML 本身(而且使用起来也更简单)。 .to_a() 的参数是 XPath,在这种情况下,可以标识文档中任何地方的所有 <person> 元素。如果我们只需要第一层上的元素,可以使用:
创建匹配元素的数组

ruby> persons = addrbook.elements.to_a("/addressbook/person")

我们甚至可以更直接地将 XPath 用作 .elements 属性的重载索引。例如:
使用 REXML 来引用嵌套数据的另一种方法

ruby> puts addrbook.elements["//person[2]/address"].attributes["city"]New York

请注意,XPath 使用基于 1 的索引,不象 Ruby 和 Python 数组使用基于 0 的索引。换句话说, 它仍是我们正在检查其所在城市的同一个人。通过查看 REXML 请注意,XPath 使用基于 1 的索引,不象 Ruby 和 Python 数组使用基于 0 的索引。换句话说, 它仍是我们正在检查其所在城市的同一个人。通过查看
用 REXML 显示元素的 XML 源代码

ruby> puts addrbook.elements["//person[2]/address"]<address city='New York' street='118 St.' number='344' state='NY'/>ruby> puts addrbook.elements["//person[2]/contact-info"]<contact-info> <email address='robb@iro.ibm.com'/> <home-phone number='03-3987873'/></contact-info>

此外,XPath 不必只与一个元素匹配。我们已在定义 persons 数组时看见过,但另一个示例强调了这一点:
将多个元素与 XPath 匹配

ruby> puts addrbook.elements.to_a("//person/address[@state='CA']")<address city='Sacramento' street='Spruce Rd.' number='99' state='CA'/><address city='Los Angeles' street='Pine Rd.' number='1234' state='CA'/>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表