Ruby使用REXML库来解析xml格式数据的方法
REXML是Ruby内置的轻量XML解析库,提供DOM与SAX两种解析方式,分别适用于中小型和大型文件。支持XPath查询,但存在解析嵌套递归元素时的拒绝服务攻击漏洞,需根据不同Rails版本进行修复,开发者应及时升级或应用补丁。
在 Ruby 的世界里,处理 XML 有一个非常轻量的选择——REXML。它完全用 Ruby 编写,不到 2000 行代码,却提供了完整的 API 支持。需要明确的是,REXML 内置在 Ruby 中,开箱即用,无需额外安装。它的核心解析方式有两种:DOM-like 和 SAX-like。前者将整个文件读入内存并构建成树形结构,适合中小型文件;后者则是“边解析边处理”,当文件特别大、内存有限时,SAX 方式才是更靠谱的选择。

来看一个具体的例子。假设有一个 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 方式解析。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
}
如果需要对 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目录即可。
这些细节平时可能用不到,但真碰上问题的时候就来不及临时查了。记一笔,以备不时之需。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















