我有一个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)}`
请帮我解决这个问题。等待你的早日回复...
答案 0 :(得分:1)
String#gsub!
就地修改字符串,将所有实例替换为指定的替换。如果您只想替换第一个实例,请使用String#sub
或String.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,我不确定是否提取它是值得的。
确切的代码取决于您选择的解析器。通常他们有很好的文档/教程,所以我相信你能够处理它。