首选Nokogiri,因其性能高、功能全、支持XPath/CSS选择器及自动编码检测;仅需轻量解析且零依赖时可选REXML。

Ruby处理XML主要靠REXML(标准库)和Nokogiri(第三方主流库),两者定位不同:REXML轻量、无需安装依赖,适合简单解析;Nokogiri性能高、功能全、支持XPath/CSS选择器和命名空间,适合复杂场景。
REXML:开箱即用,适合基础操作
REXML是Ruby自带的XML库,无需gem install,适合读取配置文件、生成简单XML或教学演示。
- 解析字符串:
REXML::Document.new(xml_string) - 遍历节点:
doc.root.elements.each("item") { |e| puts e.text } - 写入XML:
doc.write($stdout, 2)(缩进2格输出) - 注意:不支持XPath 1.0完整语法,CSS选择器不可用;对大文件较慢,且默认不校验编码,中文需确保源字符串为UTF-8
Nokogiri:高性能首选,推荐用于生产环境
Nokogiri底层基于libxml2,解析快、内存友好,API统一支持XML/HTML,并提供XPath与CSS双选择器。
- 安装:
gem install nokogiri(多数系统自动编译,macOS可能需先装libxml2) - 解析XML:
doc = Nokogiri::XML(xml_string)(自动检测编码,可显式传:encoding => 'UTF-8') - 查找元素:
doc.css("book title")或doc.xpath("//author[contains(text(), 'Tanaka')]") - 修改与生成:
node.content = "New text",doc.to_xml(indent: 2) - 注意:若XML含DTD或外部实体,默认禁用加载(安全考虑),如需启用需手动配置
XML::ParseOptions::NOENT
选哪个?看场景
新项目或有XPath/CSS需求,直接用Nokogiri;仅需读写极简XML且想零依赖,REXML够用;已有REXML代码但性能吃紧,迁移至Nokogiri通常只需改几行初始化和查询语句。
小技巧:快速判断XML是否良构
Nokogiri解析失败会抛Nokogiri::XML::SyntaxError,可捕获后打印错误位置:
begin; doc = Nokogiri::XML(str); rescue Nokogiri::XML::SyntaxError => e; puts e.message; end- REXML中可用
REXML::ParseException做类似检查










