6

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

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

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

如您所见,拥有和额外的 CRLF。我不知道为什么它有这种行为,但我正在用 ruby​​ 脚本解决它。但是我遇到了麻烦,因为我需要查看该行的最后一个字符是“ > ”还是第一个字符是“ < ”,以便我可以查看标记是否有问题。

我试过了:

Dir.glob("C:/testing/corrected/*.xml").each do |file|

puts file

  File.open(file, 'r+').each_with_index do |line, index|

    first_char = line[0,1]

    if first_char != "<"
        //copy this line to the previous line and delete this one?
    end

  end

end

我也觉得我应该在将原始文件内容读取到另一个临时文件然后覆盖时将其复制。这是最好的“方式”吗?欢迎任何提示,因为我在更改文件内容方面没有太多经验。

问候

4

1 回答 1

12

额外的是否\n总是出现在<SUPPLIER>节点中?正如其他人所建议的那样,Nokogiri 是解析 XML(或 HTML)的绝佳选择。您可以遍历每个<SUPPLIER>节点并删除\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
于 2013-06-02T17:11:20.100 回答