1

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のエラーが表示されていました。これは問題ですか?

4

3 に答える 3

2

ここでは @halfelf が正しいと思います。API ドキュメントによると、Dir.foreachはディレクトリ内のすべてのエントリを反復処理し、Unix では 2 つのディレクトリ....

Dir.foreach呼び出しの数行前に、 glob を使用して というファイルの配列を作成しますxml_files。代わりにループでそれを繰り返すとどうなりますか?

于 2013-05-31T04:15:25.097 に答える
1

単なる推測: によって返されるすべてDir.foreach(Dir.pwd)が読み取り可能なファイルであるとは限りません。それらのいくつかはディレクトリです。

于 2013-05-31T03:36:03.780 に答える
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
于 2013-05-31T06:06:55.873 に答える