用Ruby替换文件中的文本

时间:2011-10-14 04:05:18

标签: ruby xml

我需要读取一个文件,该文件将采用xml格式,但所有文件都塞进一行,我需要解析该行以查找特定属性并将其值替换为我指定的值。

该文件可能包含:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><VerificationPoint type="Screenshot" version="2"><Description/><Verification object=":qP1B11_QLabel" type="PNG">

我需要搜索这一行,找到属性“Verification object =”并用我自己的字符串替换:qP1B11。请注意,如果可能,我不想替换字符串的_QLabel" type="PNG">部分。

我不能使用 sub ,因为我不重视可能是任何东西的属性,我相信我应该能够使用正则表达式执行此操作,但我从未使用过他们之前和我见过的所有例子都让我比以前更加困惑。

如果有人能给我一个优雅的答案(以及使用正则表达式的解释),那将是一个巨大的帮助!

由于

1 个答案:

答案 0 :(得分:4)

您拥有XML,因此请使用XML解析器。 Nokogiri将做一些简短的工作:

doc = Nokogiri::XML(that_string)
doc.search('Verification').each do |node|
    node['object'] = node['object'].sub(/:qP1B11/, 'PANCAKES')
end
new_string = doc.to_xml
# <?xml version="1.0" encoding="UTF-8" standalone="no"?>\n<VerificationPoint type="Screenshot" version="2">\n  <Description/>\n  <Verification object="PANCAKES_QLabel" type="PNG">\n</Verification>\n</VerificationPoint>\n"

您可以使用to_xml的选项调整输出格式。

如果你只有一个<Verification>,那么你可以这样做:

node = doc.at('Verification')
node['object'] = node['object'].sub(/:qP1B11/, 'PANCAKES')
new_string = doc.to_xml

在任何一种情况下,您都可以根据自己的需要调整正则表达式和替代品。