Ruby-读取和编辑XML文件

Ruby-读取和编辑XML文件,ruby,xml,ruby-1.9.3,Ruby,Xml,Ruby 1.9.3,我正在编写一个Ruby(1.9.3)脚本,从文件夹中读取XML文件,然后在必要时对其进行编辑 我的问题是,我收到了由转换的XML文件,但其输出有点奇怪,例如: <?xml version="1.0" encoding="utf-8"?> <XML> <item> <ID>000001</ID> <YEAR>2013</YEAR> <SUPPLIER>Suppli

我正在编写一个Ruby(1.9.3)脚本,从文件夹中读取XML文件,然后在必要时对其进行编辑

我的问题是,我收到了由转换的XML文件,但其输出有点奇怪,例如:

<?xml version="1.0" encoding="utf-8"?>
<XML>
  <item>
      <ID>000001</ID>
      <YEAR>2013</YEAR>
      <SUPPLIER>Supplier name test,
      Coproration</SUPPLIER>
...

000001
2013
供应商名称测试,
共担
...

正如你所看到的,has和额外的CRLF。我不知道它为什么有这种行为,但我正在用ruby脚本解决它。但是我遇到了麻烦,因为我需要查看行的最后一个字符是“”还是第一个字符是“”,额外的
\n
是否总是出现在
节点中?正如其他人所建议的,Nokogiri是解析XML(或HTML)的最佳选择。您可以遍历每个
节点并删除
\n
字符,然后将XML另存为新文件

require 'nokogiri'

# read and parse the old file
file = File.read("old.xml")
xml = Nokogiri::XML(file)

# replace \n and any additional whitespace with a space
xml.xpath("//SUPPLIER").each do |node|
  node.content = node.content.gsub(/\n\s+/, " ")
end

# save the output into a new file
File.open("new.xml", "w") do |f|
  f.write xml.to_xml
end

我建议您使用
nokogiri
。正如@RubyLovely建议的那样,使用像nokogiri这样的xml gem。您试图将xml处理为txt,这既不是一个好主意,也严重不利于车轮的重新发明。嗯,我明白了,我并不局限于ruby,但我会研究nokogiri。我希望Tidy不会引起这样的麻烦。呵呵:)Regexp:
/^$/
,但是那些家伙说了什么。任何时候你想到“文本处理”,想到“regexp”,但任何时候你想到“格式化文本处理”,首先去寻找一个gem。你也可以
行[0]
行[-1]
作为第一个和最后一个字符。谢谢你,尽管它没有直接解决我的问题(它并不总是节点,这对于另一项任务非常有用:)您可以将解决方案概括为在项的每个子节点的内容上运行
gsub
。例如,您可以将
xml.xpath(“//SUPPLIER”)。每个do |节点
更改为
xml.xpath(//item//*).每个do | node |
是的,虽然我没有使用与您建议的完全相同的解决方案,但它是相似的,因此被接受为答案
require 'nokogiri'

# read and parse the old file
file = File.read("old.xml")
xml = Nokogiri::XML(file)

# replace \n and any additional whitespace with a space
xml.xpath("//SUPPLIER").each do |node|
  node.content = node.content.gsub(/\n\s+/, " ")
end

# save the output into a new file
File.open("new.xml", "w") do |f|
  f.write xml.to_xml
end