首选Nokogiri,因其性能高、功能全、支持XPath/CSS选择器及自动编码检测;仅需轻量解析且零依赖时可选REXML。
Ruby处理XML主要靠REXML(标准库)和Nokogiri(第三方主流库),两者定位不同:REXML轻量、无需安装依赖,适合简单解析;Nokogiri性能高、功能全、支持XPath/CSS选择器和命名空间,适合复杂场景。
REXML是Ruby自带的XML库,无需gem install,适合读取配置文件、生成简单XML或教学演示。
REXML::Document.new(xml_string)
doc.root.elements.each("item") { |e| puts e.text }
doc.write($stdout, 2)(缩进2格输出)Nokogiri底层基于libxml2,解析快、内存友好,API统一支持XML/HTML,并提供XPath与CSS双选择器。
gem install nokogiri(多数系统自动编译,macOS可能需先装libxml2)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::ParseOptions::NOENT
新项目或有XPath/CSS需
求,直接用Nokogiri;仅需读写极简XML且想零依赖,REXML够用;已有REXML代码但性能吃紧,迁移至Nokogiri通常只需改几行初始化和查询语句。
Nokogiri解析失败会抛Nokogiri::XML::SyntaxError,可捕获后打印错误位置:
begin; doc = Nokogiri::XML(str); rescue Nokogiri::XML::SyntaxError => e; puts e.message; endREXML::ParseException做类似检查