位置:首页 > Ruby > Ruby使用REXML库解析XML格式数据的方法详解

Ruby使用REXML库解析XML格式数据的方法详解

时间:2026-08-17  |  作者:极客少年  |  阅读:0

REXML 是 Ruby 世界里处理 XML 的一个非常轻量的选择。它完全用 Ruby 编写,不到 2000 行代码,却提供了完整的 API 支持。

需要明确的是,REXML 内置在 Ruby 中,开箱即用,无需额外安装。

它的核心解析方式有两种:DOM-like 和 SAX-like。

  • DOM-like:将整个文件读入内存,并构建成树形结构,适合中小型文件。
  • SAX-like:边解析边处理。当文件特别大、内存有限时,SAX 方式才是更靠谱的选择。

Ruby使用REXML库来解析xml格式数据的方法

示例 XML 文件

来看一个具体的例子。假设有一个 XML 文件 movies.xml,内容如下:


 
 War, Thriller
 DVD
 2003
 PG
 10
 Talk about a US-Japan war
 
 
 Anime, Science Fiction
 DVD
 1989
 R
 8
 A schientific fiction
 
 
 Anime, Action
 DVD
 4
 PG
 10
 Vash the Stampede!
 
 
 Comedy
 VHS
 PG
 2
 Viewable boredom
 

使用 DOM 方式解析

先用 DOM 方式解析。REXML 的 DOM 接口会直接把 XML 文档映射为树,操作起来很直观。

require 'rexml/document'
include REXML
xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)
root = xmldoc.root
puts "Root element : " + root.attributes["shelf"]
xmldoc.elements.each("collection/movie"){
 |e| puts "Movie Title : " + e.attributes["title"]
}
xmldoc.elements.each("collection/movie/type") {
 |e| puts "Movie Type : " + e.text
}
xmldoc.elements.each("collection/movie/description") {
 |e| puts "Movie Description : " + e.text
}

使用 XPath 查询节点

如果需要对 XML 进行更灵活的查询,XPath 是更好的选择。REXML 内置了 XPath 支持,可以快速定位节点。

require 'rexml/document'
include REXML
xmlfile = File.new("movies.xml")
xmldoc = Document.new(xmlfile)
movie = XPath.first(xmldoc, "//movie")
p movie
XPath.each(xmldoc, "//type") { |e| puts e.text }
names = XPath.match(xmldoc, "//format").map {|x| x.text }
p names

安全问题与修复方式

代码足够应对日常场景,但还有一件事不得不提:REXML 的安全隐患

Ruby 官方在 2008 年 8 月 23 日发布安全通告指出,REXML 在解析具有嵌套递归元素的 XML 文件时,存在拒绝服务攻击的缺陷,可能导致服务器资源耗尽。

如果你在 Rails 应用中使用了 XML 解析,需要及时修复。

针对不同 Rails 版本的修复方式

  • Rails 2.0.2 及更早版本:下载修复文件,将其拷贝到 RAILS_ROOT/lib 目录,并在 environment.rb 中添加 require 'rexml-expansion-fix'
  • Rails 2.1.0 及以上版本:下载修复文件,拷贝到 RAILS_ROOT/config/initializers 目录即可。

这些细节平时可能用不到,但真碰上问题的时候,就来不及临时查了。记一笔,以备不时之需。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多