Ruby Nokogiri怎么构建XML文档
Nokogiri::XML::Builder.new 是构建 XML 的最可控起点,需注意命名空间声明、属性哈希必须首参、UTF-8 编码显式指定,避免动态追加节点和错误解析方式。
用 Nokogiri::XML::Builder 创建空文档再填充
直接调用 Nokogiri::XML::Builder.new 是最可控的起点,它默认生成带 XML 声明的空文档,且节点自动闭合逻辑清晰。别用 Nokogiri::XML 的字符串解析方式来“构建”,那是为解析设计的,强行拼接容易漏转义或结构错乱。
常见错误是传入空字符串或 nil 初始化 builder,导致后续 doc 属性不可用:
Nokogiri::XML::Builder.new { |xml| xml.root { xml.child "text" } }.doc
# ✅ 正确:闭包内定义结构,返回完整文档对象注意 builder 默认不加换行缩进,如需可手动插入 \n 或用 to_xml(indent: 2) 输出时格式化。
嵌套标签与属性必须用哈希传参
Nokogiri::XML::Builder 的 DSL 要求属性必
须作为第一个参数以哈希形式传入,内容(文本或子块)在后。顺序错了会把属性当文本、或抛 ArgumentError:
-
xml.tag({ id: "1" }, "value")✅ -
xml.tag("value", { id: "1" })❌ —— 这会把 "value" 当作属性哈希的 key -
xml.tag(id: "1") { "value" }✅ —— 块内写文本也合法
特殊字符如 &、 会被自动转义,无需手动调 CGI.escape;但 CDATA 需显式调用 xml.cdata 方法。
处理命名空间和前缀要提前声明
如果目标 XML 含命名空间(如 xmlns:ns="http://example.com"),不能靠后期追加属性。必须在根节点初始化时用 xmlns 键声明,并在子节点中用符号前缀引用:
Nokogiri::XML::Builder.new do |xml|
xml.root("xmlns:ns" => "http://example.com") do
xml["ns"].item("NS content")
end
end.doc没声明就直接写 xml.ns:item 会报 NoMethodError;用字符串前缀如 xml["ns"].item 才是正确语法。多个命名空间可并列传入哈希,但冲突前缀会导致覆盖。
中文或 UTF-8 内容要确保 Builder 实例编码一致
默认 builder 生成文档是 UTF-8 编码,但若 Ruby 源文件本身不是 UTF-8(比如系统 locale 是 GBK),中文字符串可能被错误解释为 ASCII-8BIT,导致输出乱码或 Encoding::CompatibilityError。
安全做法是显式指定编码:
Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
xml.root { xml.text "你好" }
end.doc.to_xml另外,避免用 doc.root.add_child 动态追加含中文的 Nokogiri::XML::Text 节点——它不会自动继承父节点编码,容易出错。所有内容尽量在 builder 闭包内一次性定义。
命名空间声明、属性传参顺序、编码一致性这三点,实际项目里最容易反复踩坑。
技术教程SEO上一篇 : oppo手机蓝牙链接失败咋修复_oppo手机蓝牙配对排解法【方法】
下一篇 : 京东双十二百亿补贴怎么领 京东双十二红包雨每日整点抢
-
SEO外包最佳选择国内专业的白帽SEO机构,熟知搜索算法,各行业企业站优化策略!
SEO公司
-
可定制SEO优化套餐基于整站优化与品牌搜索展现,定制个性化营销推广方案!
SEO套餐
-
SEO入门教程多年积累SEO实战案例,从新手到专家,从入门到精通,海量的SEO学习资料!
SEO教程
-
SEO项目资源高质量SEO项目资源,稀缺性外链,优质文案代写,老域名提权,云主机相关配置折扣!
SEO资源
-
SEO快速建站快速搭建符合搜索引擎友好的企业网站,协助备案,域名选择,服务器配置等相关服务!
SEO建站
-
快速搜索引擎优化建议没有任何SEO机构,可以承诺搜索引擎排名的具体位置,如果有,那么请您多注意!专业的SEO机构,一般情况下只能确保目标关键词进入到首页或者前几页,如果您有相关问题,欢迎咨询!