2013-05-31 84 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