2013-05-31 61 views
1

我不确定这是REXML还是ruby问题。 但是,当我使用REXML时发生这种情况。与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) 

它不给错误。

Folder/home/askar/xml_files1只包含3个xml文件。

我使用Linux Mint的纳迪亚和

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

如果你注意到了,出于某种原因,错误显示1.9.1。这是一个问题吗?

+0

你为什么要使用REXML?就XML解析器而言,它已经走到了尽头。我强烈推荐使用[Nokogiri](http://nokogiri.org)。它速度更快,功能更全面。 Tinman, –

+0

,谢谢你宝贵的建议。我必须查看它! :) – Askar

回答

1

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

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

+0

当用“glob”替换“foreach”时,我得到了相同的错误。我甚至创建了新的文件夹,并且只放3个文件,所以我知道没有目录。我简化了代码,它为我工作,因为我注释掉了xmldoc = Document.new(xmlfile),但xmlfile = File.new(file)确实有效。请参阅更新(简化)代码的帖子。 – Askar

+0

你仍然没有解决这个问题,这是这行:'Dir.foreach(Dir.pwd)do | file |'。尝试用'xml_files.each do | file |'替换它'' – dpassage

+0

谢谢!有效! – Askar

1

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

+0

我知道那里只有文件。 – Askar

+0

你确定吗?那么在'File.new'周围添加'begin rescue'来查看哪个文件无法打开呢? – halfelf

+0

是的。我甚至创建了空目录并进行了检查。我注意到它给行xmldoc = Document.new(xmlfile)的错误。当我从这一行注释到块的结尾时,它不会给出错误。所以关键是:xmldoc = Document.new(xmlfile) – Askar

0

使用引入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