1

当我查看 XML 文件时,它看起来很好,并且以<?xml version="1.0" encoding="utf-16le" standalone="yes"?>

但是当我用 Ruby 阅读它并将其打印出来时,前面有两个 ?s:??<?xml version="1.0" encoding="utf-16le" standalone="yes"?>

这些来自哪里,我如何删除它们?用 REXML 像这样解析它会立即失败。删除第一个字符然后解析它,给我这个错误:

REXML::ParseException: #<REXML::ParseException: malformed XML: missing tag start Line: Position: Last 80 unconsumed characters: <?xml version="1.0" encoding="utf-16le" s>

处理这个问题的正确方法是什么?

编辑:下面是我的代码。从ftp.getftp 服务器下载 xml。(我想知道这是否相关。)

xml = ftp.get
puts xml
until xml[0,1] == "<"  # to remove the 2 invalid characters
  puts xml[0,2]
  xml.slice! 0
end
puts xml
document = REXML::Document.new(xml)

最后一个 puts 打印正确的 xml。但是由于这两个无效字符,我感觉有些地方出了问题。没有必要删除任何东西。不过,我不知道问题可能是什么。

编辑 2:我正在使用 Net::FTP 下载 XML,但使用这种新方法可以让我将内容读入字符串而不是文件:

class Net::FTP

  def gettextcontent(remotefile, &block) # :yield: line
    f = StringIO.new()
    begin
      retrlines("RETR " + remotefile) do |line|
        f.puts(line)
        yield(line) if block
      end
    ensure
      f.close
      return f
    end
  end
end

编辑 3:这似乎是由不支持 unicode 的 StringIO(在 Ruby 1.8.7 中)引起的。我不确定是否有解决方法。

4

2 回答 2

5

这两个字符很可能是unicode bom:告诉正在读取文件的人的字节顺序是什么。

只要您知道文件的编码是什么,剥离它们就应该是安全的——它们不是实际内容

于 2012-07-26T14:56:48.600 回答
0

要回答我自己的问题,这里真正的问题是缺少 Ruby 1.8.7 中的编码支持。StringIO 特别似乎把它弄得一团糟。REXML 在 Ruby 1.8.7 中处理 unicode 也有问题。

最吸引人的解决方案当然是升级到 1.9.3,但这对于目前的项目来说并不实用。

所以我最终做的是,避免使用 StringIO 并简单地下载到磁盘上的文件,然后使用 nokogiri 代替使用 REXML 处理 XML。

在一起,这解决了我所有的问题。

于 2012-08-03T14:18:11.800 回答