ruby - Ruby 中我的 XML 之前的无效字符

标签 ruby xml rexml

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

但是当我在 Ruby 中读取它并将它打印到 stout 时,前面有两个 ?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.get从 ftp 服务器下载 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 中)引起的。我不确定是否有解决方法。

最佳答案

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

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

关于ruby - Ruby 中我的 XML 之前的无效字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11671708/

相关文章:

ruby - Rexml - 带有内联文本和缩进子标签的 pretty-print

ruby-on-rails - REXML::ParseException 没有有效的根

ruby - 按组大小排列的 Active Record 顺序

ruby-on-rails - Elasticsearch on Query 的 Facet 问题

ruby - 在 Vagrant 配置 Bash 脚本中运行 Ruby 文件

xml - 在 actionscript 中,检查 xml 节点属性是否存在的最佳方法是什么?

java - 在抽屉导航中更改特定菜单项的文本大小

ruby - 关闭不起作用

c# - 如何从 xml 中获取数据,通过 linq,c#

ruby - REXML 在 ruby​​ 中解析 XML