如何使用 Nokogiri 在 TMX 中搜索道具元素

Posted

技术标签:

【中文标题】如何使用 Nokogiri 在 TMX 中搜索道具元素【英文标题】:How to search for prop elements in TMX with Nokogiri 【发布时间】:2021-12-23 15:48:48 【问题描述】:

我有一个 TMX 翻译记忆库文件,我需要对其进行解析才能将其导入新数据库。我正在使用 Ruby + Nokogiri。这是 TMX (xml) 结构:

<body>
<tu creationdate="20181001T113609Z" creationid="some_user">
<prop type="Att::Attribute1">Value1</prop>
<prop type="Txt::Attribute2">Value2</prop>
<prop type="Txt::Attribute3">Value3</prop>
<prop type="Txt::Attribute4">Value4</prop>
<tuv xml:lang="EN-US">
<seg>Testing</seg>
</tuv>
<tuv xml:lang="SL">
<seg>Testiranje</seg>
</tuv>
</tu>
</body>

为简单起见,我在这里只包含了 1 个 TU 节点。

这是我当前的脚本:

require 'nokogiri'

doc = File.open("test_for_import.xml")  |f| Nokogiri::XML(f) 

doc.xpath('//tu').each do |x|
  puts "Creation date: " + x.attributes["creationdate"]
  puts "User: " + x.attributes["creationid"]

  x.children.each do |y|
    puts y.children
  end

end

这会产生以下结果:

Creation date: 20181001T113609Z
User: some_user
Value1
Value2
Value3
Value4

<seg>Testing</seg>


<seg>Testiranje</seg>

我需要做的是搜索Attribute1,它是相应的值并分配给一个变量。在新数据库中创建翻译记录时,这些将用作属性。我需要 seg 相同的内容来获取源代码和翻译。我不想依赖顺序,即使它应该/总是相同。

继续的最佳方式是什么?所有元素都属于Nokogiri::XML::NodeSet 类。即使在查看文档之后,我仍然卡住了。

有人可以帮忙吗?

最好的,塞巴斯蒂安

【问题讨论】:

【参考方案1】:

像这样遍历节点树的最简单方法是使用 XPath。您已经使用 XPath 获取*** tu 元素,但您可以进一步扩展 XPath 查询以获取您正在寻找的特定元素。

Here on DevHints 是一个方便的备忘单,说明您可以使用 XPath 做什么。

相对于指向 tu 元素的 x 变量,以下是您要使用的 XPath:

prop[@type="Att::Attribute1"] 用于查找属性 1 的 prop //segtuv/seg 用于查找 seg 元素

这是使用这些 XPath 的完整代码示例。 at_xpath 方法返回一个结果,而xpath 方法返回所有结果。

require 'nokogiri'

doc = File.open("test_for_import.xml")  |f| Nokogiri::XML(f) 

doc.xpath('//tu').each do |x|
  puts "Creation date: " + x.attributes["creationdate"]
  puts "User: " + x.attributes["creationid"]

  # Get Attribute 1
  # There should only be one result for this, so using `at_xpath`
  attr1 = x.at_xpath('prop[@type="Att::Attribute1"]')
  puts "Attribute 1: " + attr1.text

  # Get each seg
  # There will be many results, so using `xpath`
  segs = x.xpath('//seg')
  segs.each do |seg|
    puts "Seg: " + seg.text
  end
end

这个输出:

Creation date: 20181001T113609Z
User: some_user
Attribute 1: Value1
Seg: Testing
Seg: Testiranje

【讨论】:

这很好用。但是,要在具有多个 TU 的文件上运行它,我确实需要使用选项“tuv/seg”。太感谢了!也可以链接到备忘单。

以上是关于如何使用 Nokogiri 在 TMX 中搜索道具元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Nokogiri 中解析图像 href

如何使用 Nokogiri 访问属性

如何使用 Nokogiri 插入具有适当缩进的 HTML 块?

如何使用 Nokogiri 解析 HTML 表格?

如何在 Mac OS Sierra 10.12 上安装 Nokogiri

如何通过 Nokogiri 在页面上获取特定的可查看字符串