Ruby如何处理XML REXML和Nokogiri库

首选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做类似检查