REXML 是 Ruby 标准库内置的轻量 XML 解析方案,支持字符串/文件解析、XPath 查询、树遍历、动态生成与格式化输出,适用于中小型任务,需注意命名空间、空白处理、大文件及编码问题。
Ruby 解析 XML 最常用、标准库自带的方案就是 REXML。它轻量、无需额外安装,适合中小型 XML 处理任务(如读取配置、解析 API 响应、生成简单 XML 报文等)。下面用清晰、实用的方式讲清楚怎么用。
REXML 默认已包含在 Ruby 标准库中,直接 require 即可。解析入口通常是 REXML::Document:
require 'rexml/document'
doc = REXML::Document.new("") - Hello
doc = REXML::Document.new(File.read("data.xml"))(注意编码,如有中文建议加 File.read("data.xml", encoding: "UTF-8"))获取节点最直观的是 XPath —— 简洁且表达力强:
的文本:doc.elements.each("//item") { |e| puts e.text }
doc.elements.each("//item[@id='1']") { |e| puts e.text }
e.attributes["id"](e 是一个 REXML::Element)也可用树形遍历(适合逻辑较复杂、需逐层判断的场景):doc.root.each_element do |child|
puts "#{child.name}: #{child.text}"
end
REXML 支持动态创建和修改:
doc = REXML::Document.new
root = doc.add_element("response")
root.add_element("status").text = "success"
root.add_element("count").text = "42"
item = doc.root.add_element("item")
item.add_attribute("type", "urgent")
item.text = "Fix bug now"
require 'rexml/formatters'
formatter = REXML::Formatters::Pretty.new(2)
formatter.write(doc, $stdout)
实际用时容易踩几个小坑:
xmlns,需显式声明并使用前缀,例如:doc = REXML::Document.new(xml)
doc.namespaces["ns"] = "http://example.com/ns"
doc.elements["//ns:item"]
e.text.strip 更安全REXML::Parsers::BaseParser 或考虑 Nokogiri(更高效
,但需 gem install)),Ruby 读取时也指定 encoding