如何在找到匹配项后替换ruby文件中的字符串

时间:2011-08-10 07:58:28

标签: ruby

我有一个xml文件,我需要从我的ruby脚本中修改并保存它。 xml文件看起来像     `

<mtn:messages>

 <mtn:message correlation-key="0x" sequence="4">

  <mtn:header>

   <mtn:protocol-version>0x4</mtn:protocol-version>

    <mtn:message-type>0x0F04</mtn:message-type>

     <mtn:ttl>4</mtn:ttl>

     <mtn:qos-class-of-service>0</mtn:qos-class-of-service>

     <mtn:qos-priority>2</mtn:qos-priority>

      </mtn:header>

</mtn:message>

  </mtn:messages>

</mtn:test-case>

<mtn:test-case title="Train-Consist-Message">

<mtn:messages>

 <mtn:message correlation-key="0x" sequence="4">

  <mtn:header>

   <mtn:protocol-version>0x4</mtn:protocol-version>

    <mtn:message-type>0x0F04</mtn:message-type>

     <mtn:ttl>4</mtn:ttl>

     <mtn:qos-class-of-service>0</mtn:qos-class-of-service>

     <mtn:qos-priority>2</mtn:qos-priority>

      </mtn:header>

</mtn:message>

  </mtn:messages>

</mtn:test-case>`

我需要将<mtn:ttl>4</mtn:ttl>替换为<mtn:ttl>some other value</mtn:ttl>下的<mtn:test-case title="Train-Consist-Message">并保存。

我写了下面的代码,但它取代了<mtn:ttl>4</mtn:ttl>的所有出现。

`doc = IO.read(ENV['CadPath1']+ "conf\\cad-mtn-config.xml")
 doc.gsub!(pattern, str)
 File.open("File path", "w"){|fh| fh.write(doc)}`

请帮我解决这个问题。等待你的早日回复...

2 个答案:

答案 0 :(得分:1)

String#gsub!就地修改字符串,将所有实例替换为指定的替换。如果您只想替换第一个实例,请使用String#subString.sub!

答案 1 :(得分:1)

迈克关于使用sub代替gsub的建议很好。但是,使用正则表达式解析XML(和HTML)通常是不受欢迎的。

根据你的问题,我假设你根据父子关系找到了待修饰元素,而不是源代码顺序(即你不能说:“修改第二次出现的这种模式“),因此发明一个可靠的正则表达式可能非常非常困难。

您应该使用解析器库来查找要更改的元素。有很多这样的集合。在http://ruby-toolbox.com/categories/html_parsing.html查看其中一些并选择一个,或使用内置的REXML库。

或者,你可以使用一个非常简单的'html-scanner'模块,它包含在Rails的ActionController(action_controller / vendor / html-scanner.rb)中,但是如果你不使用Rails,我不确定是否提取它是值得的。

确切的代码取决于您选择的解析器。通常他们有很好的文档/教程,所以我相信你能够处理它。