如何使用 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
//seg
或 tuv/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 插入具有适当缩进的 HTML 块?