在Ruby开发中,处理xml格式的数据是经常会遇到的场景,比如对接第三方接口返回xml格式数据、解析本地xml配置文件等。Nokogiri是Ruby中功能强大且易用的xml和html解析库,能够高效完成xml数据的解析和处理工作。

Nokogiri库的安装
Nokogiri的安装非常简单,只需要使用Ruby的包管理工具gem即可完成安装,打开终端执行以下命令:
# 安装Nokogiri库 gem install nokogiri
安装完成后,可以在Ruby脚本中通过require引入库,验证是否安装成功:
require 'nokogiri'
# 如果没有报错则说明安装成功
puts "Nokogiri安装成功,版本为:#{Nokogiri::VERSION}"Nokogiri解析xml的核心用法
1. 解析xml字符串或文件
Nokogiri提供了多种解析xml的方式,既可以解析xml格式的字符串,也可以直接解析本地的xml文件。
require 'nokogiri'
# 待解析的xml字符串示例
xml_str = <?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
<email>lisi@ipipp.com</email>
</user>
</users>
# 解析xml字符串
doc = Nokogiri::XML(xml_str)
# 解析本地xml文件,假设文件名为users.xml
# doc = Nokogiri::XML(File.open("users.xml"))2. 查询xml节点
Nokogiri支持使用CSS选择器或者XPath语法查询xml中的节点,两种方式都非常灵活。
require 'nokogiri'
xml_str = <?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
<email>lisi@ipipp.com</email>
</user>
</users>
doc = Nokogiri::XML(xml_str)
# 使用CSS选择器查询所有user节点
users_css = doc.css("user")
puts "CSS选择器查询到的用户数量:#{users_css.length}"
# 使用XPath语法查询所有user节点
users_xpath = doc.xpath("//user")
puts "XPath查询到的用户数量:#{users_xpath.length}"
# 查询id为1的user节点
target_user = doc.at_css("user[id='1']")
puts "查询到的目标用户:#{target_user}"3. 获取节点内容和属性
查询到节点之后,可以获取节点的文本内容、标签名以及节点的属性值。
require 'nokogiri'
xml_str = <?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
</users>
doc = Nokogiri::XML(xml_str)
user_node = doc.at_css("user")
# 获取节点的id属性
user_id = user_node["id"]
puts "用户ID:#{user_id}"
# 获取name节点的文本内容
user_name = user_node.at_css("name").text
puts "用户姓名:#{user_name}"
# 获取age节点的文本内容
user_age = user_node.at_css("age").text
puts "用户年龄:#{user_age}"
# 获取email节点的文本内容
user_email = user_node.at_css("email").text
puts "用户邮箱:#{user_email}"4. 遍历xml节点
当xml中有多个同类型节点时,可以通过遍历的方式逐个处理每个节点。
require 'nokogiri'
xml_str = <?xml version="1.0" encoding="UTF-8"?>
<users>
<user id="1">
<name>张三</name>
<age>25</age>
</user>
<user id="2">
<name>李四</name>
<age>28</age>
</user>
</users>
doc = Nokogiri::XML(xml_str)
# 遍历所有user节点
doc.css("user").each do |user|
id = user["id"]
name = user.at_css("name").text
age = user.at_css("age").text
puts "用户ID:#{id},姓名:#{name},年龄:#{age}"
end注意事项
在使用Nokogiri处理xml时,需要注意xml的编码格式,如果解析出现乱码,可以在解析时指定编码:
# 指定编码为UTF-8解析xml doc = Nokogiri::XML(xml_str, nil, 'UTF-8')
另外,如果xml格式不规范,Nokogiri会自动尝试修复,但是建议尽量保证待解析的xml格式正确,避免解析出现意外问题。