【问题标题】:error related to REXML与 REXML 相关的错误
【发布时间】:2013-05-31 03:30:48
【问题描述】:

我不确定是 REXML 还是 ruby​​ 问题。 但是当我使用 REXML 时就会发生这种情况。

下面的程序应该访问目录中每个 xml 文件的元素。

#!/usr/bin/ruby -w

require 'rexml/document'
include REXML

p "Current directory was: " + Dir.pwd

Dir.chdir("/home/askar/xml_files1") {

    p "Now we're in: " + Dir.pwd

    if File.exist?(Dir.pwd)

        xml_files = Dir.glob("ShipmentRequest*.xml")

        Dir.foreach(Dir.pwd) do |file|

            xmlfile = File.new(file)
            xmldoc = Document.new(xmlfile)

        end

    else
        puts "It's empty"
    end

}

当我跑步时:

ruby import_xml.rb

错误:

"Current directory was: /home/askar/Dropbox/rails_studio/xml_to_mysql"
"Now we're in: /home/askar/xml_files1"
There're 6226 files in the folder...
/home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/source.rb:148:in `read': Is a directory - . (Errno::EISDIR)
    from /home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/source.rb:148:in `initialize'
    from /home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/source.rb:14:in `new'
    from /home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/source.rb:14:in `create_from'
    from /home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:127:in `stream='
    from /home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/parsers/baseparser.rb:116:in `initialize'
    from /home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/parsers/treeparser.rb:9:in `new'
    from /home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/parsers/treeparser.rb:9:in `initialize'
    from /home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/document.rb:245:in `new'
    from /home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/document.rb:245:in `build'
    from /home/askar/.rvm/rubies/ruby-1.9.3-p429/lib/ruby/1.9.1/rexml/document.rb:43:in `initialize'
    from import_xml.rb:20:in `new'
    from import_xml.rb:20:in `block (2 levels) in <main>'
    from import_xml.rb:17:in `foreach'
    from import_xml.rb:17:in `block in <main>'
    from import_xml.rb:8:in `chdir'
    from import_xml.rb:8:in `<main>'

当我注释掉时:

#xmldoc = Document.new(xmlfile)

它没有给出错误。

文件夹 /home/askar/xml_files1 仅包含 3 个 xml 文件。

我正在使用 Linux Mint Nadia 和

ruby -v
ruby 1.9.3p429 (2013-05-15 revision 40747) [x86_64-linux]

如果您注意到,由于某种原因,错误显示 ruby​​ 1.9.1。这是个问题吗?

【问题讨论】:

  • 为什么要使用 REXML?就 XML 解析器而言,它已被淘汰。我强烈推荐使用Nokogiri。它速度更快,功能更齐全。
  • @the Tin Man,感谢您的宝贵建议。我得去看看! :)

标签: ruby rexml


【解决方案1】:

我认为@halfelf 在这里是正确的。 API docs 表示 Dir.foreach 将遍历目录中的每个条目 - 在 Unix 中,这包括两个目录 ...

在调用Dir.foreach 前几行,您使用glob 构建一个名为xml_files 的文件数组。如果你在循环中迭代它会发生什么?

【讨论】:

  • 我在用“glob”替换“foreach”时遇到了同样的错误。我什至创建了新文件夹,只放了 3 个文件,所以我知道没有目录。我简化了代码,它对我有用,因为我注释掉了 xmldoc = Document.new(xmlfile),但 xmlfile = File.new(file) 确实有效。请参阅更新(简化)代码的帖子。
  • 你仍然没有解决问题,这就是这一行:Dir.foreach(Dir.pwd) do |file|。尝试将其替换为 xml_files.each do |file|
【解决方案2】:

只是猜测:并非Dir.foreach(Dir.pwd) 返回的所有内容都是可以读取的文件。其中一些是目录。

【讨论】:

  • 我知道只有文件。
  • 你确定?在File.new 周围添加一个begin rescue 块,看看哪个文件无法打开?
  • 是的。我什至创建了空目录并进行了检查。我注意到它对 xmldoc = Document.new(xmlfile) 行给出了错误。当我从这条线注释掉到块的末尾时,它没有给出错误。所以关键是:xmldoc = Document.new(xmlfile)
【解决方案3】:

使用 Nokogiri,我会这样写:

#!/usr/bin/ruby -w

require 'nokogiri'

DIRNAME = "/home/askar/xml_files1"

puts "Current directory is: #{ Dir.pwd }"
Dir.chdir(DIRNAME) do

  puts "Now in: #{ DIRNAME }"
  xml_files = Dir.glob("ShipmentRequest*.xml")

  if xml_files.empty?
    puts "#{ DIRNAME } is empty."
  else
    xml_files.each do |file|
      doc = Nokogiri::XML(open(file))
      # ... do something with the doc ...
    end
  end
end

【讨论】:

    猜你喜欢
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2018-02-05
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多