如何使用Nokogiri在TMX文件中搜索prop元素并提取对应值
解决思路
核心是利用Nokogiri的XPath条件查询能力,直接按属性值筛选目标节点,完全不依赖节点在tu下的排列顺序:
- 筛选
prop节点时,通过@type属性匹配对应的属性名,直接取节点文本 - 筛选
tuv节点时,通过@xml:lang属性匹配语言编码,再向下取seg节点的文本
可运行修改后代码
require 'nokogiri' doc = File.open("test_for_import.xml") { |f| Nokogiri::XML(f) } doc.xpath('//tu').each do |tu_node| # 取基础属性 creation_date = tu_node.attributes["creationdate"]&.value user = tu_node.attributes["creationid"]&.value puts "Creation date: #{creation_date}" puts "User: #{user}" # 取Attribute1的值,不依赖节点顺序 attribute1 = tu_node.at_xpath('./prop[@type="Att::Attribute1"]')&.text puts "Attribute1: #{attribute1}" # 其他属性同理,比如要Attribute2就把@type的值换成Txt::Attribute2即可 # 按语言取seg内容 source_text = tu_node.at_xpath('./tuv[@xml:lang="EN-US"]/seg')&.text target_text = tu_node.at_xpath('./tuv[@xml:lang="SL"]/seg')&.text puts "英文源文本: #{source_text}" puts "斯洛文尼亚语译文: #{target_text}" # 这里可以加将上述变量写入数据库的逻辑 end
补充说明
- 代码中使用
&.安全调用符,避免当前tu节点缺失对应属性/节点时抛出空指针异常,如果业务上要求这些字段必须存在,可以去掉安全调用符加判空校验逻辑 - 如果需要支持多语言动态匹配,可以把语言编码存为变量,拼接进XPath查询语句即可
内容的提问来源于stack exchange,提问作者Sebastjan Hribar
相关产品推荐
相关产品推荐

