Howto write SAX2Parser stream in to a file

L

Luca g. Soave

Hello,

I'm new to Ruby and trying to write a stream in to a file,
but I can just get an empty one. I tryed in different way
found heare on the forum ( IO lib, Rio lib,
out_file << "#{doc.parse}" and so on ).

Here I show you the simplest :

-----------------------------------------
require 'rexml/parsers/sax2parser'

file = File.new "lapatyXML.xml"
doc = REXML::parsers::SAX2Parser.new file

doc.listen:)characters, ["title"]) do |title|
print "\"#{title}\" : "
end
doc.listen:)characters, ["link"]) do |link|
print "#{link} : "
end
doc.listen:)characters, ["dc:date"]) do |date|
print "#{date} : "
end
doc.listen:)characters, ["dc:subject"]) do |subject|
puts "#{subject}"
end

File.open("outfile.xls","w") do |out_file|
out_file.write "#{doc.parse}"
end
------------------------------------------

Nothing seems to work, I just get an empty file "outfile.xls" .

... of course doc.parse contain a correct stream :

irb(main):067:0> doc.inspect
=> "#<REXML::parsers::SAX2Parser:0x2f4aba8 @procs=[[:characters,
\"title\", #<Pr
oc:0x02f3c184@(irb):48>], [:characters, \"link\",
#<Proc:0x02f34114@(irb):51>],
[:characters, \"dc:date\", #<Proc:0x02f2b334@(irb):54>], [:characters,
\"dc:subj
ect\", #<Proc:0x02f201a0@(irb):57>]], @tag_stack=[], @listeners=[],
@has_listene
rs=false, @namespace_stack=[],
@parser=#<REXML::parsers::BaseParser:0x2f4ab80 @d
ocument_status=nil, @source=#<REXML::IOSource:0x2f4ab08
@source=#<File:lapatyXML
xml>, @er_source=#<File:lapatyXML.xml>, @buffer=\"<?xml
version=\\\"1.0\\\" enc
oding=\\\"UTF-8\\\"?>\", @line=0, @line_break=\">\", @orig=\"<?xml
version=\\\"1
0\\\" encoding=\\\"UTF-8\\\"?>\", @to_utf=false, @encoding=\"UTF-8\">,
@closed=
nil, @stack=[], @tags=[], @entities=[]>, @entities={}>"
irb(main):068:0>

irb(main):018:0> doc.type
(irb):18: warning: Object#type is deprecated; use Object#class
=> REXML::parsers::SAX2Parser

irb(main):019:0> doc.class
=> REXML::parsers::SAX2Parser
---------------------------------------------

Any suggestion ?

Thanks in advance
Lgs
 
P

Pit Capitain

Luca said:
I'm new to Ruby and trying to write a stream in to a file,
but I can just get an empty one. I tryed in different way
found heare on the forum ( IO lib, Rio lib,
out_file << "#{doc.parse}" and so on ).

Here I show you the simplest :

-----------------------------------------
require 'rexml/parsers/sax2parser'

file = File.new "lapatyXML.xml"
doc = REXML::parsers::SAX2Parser.new file

doc.listen:)characters, ["title"]) do |title|
print "\"#{title}\" : "
end
doc.listen:)characters, ["link"]) do |link|
print "#{link} : "
end
doc.listen:)characters, ["dc:date"]) do |date|
print "#{date} : "
end
doc.listen:)characters, ["dc:subject"]) do |subject|
puts "#{subject}"
end

File.open("outfile.xls","w") do |out_file|
out_file.write "#{doc.parse}"
end

Luca, welcome to Ruby! I've never used REXML before, so all this might
be completely wrong, but with the line

out_file.write "#{doc.parse}"

you are writing the result of the #parse method to the output file,
which might be just an empty string if the result is nil. I think all
the calls of print and puts in your listeners just write to the console
where you run your script. To get what you want I would try to change
your program to:

require 'rexml/parsers/sax2parser'

file = File.new "lapatyXML.xml"
doc = REXML::parsers::SAX2Parser.new file

File.open("outfile.xls","w") do |out_file|

doc.listen:)characters, ["title"]) do |title|
out_file.print "\"#{title}\" : "
end
doc.listen:)characters, ["link"]) do |link|
out_file.print "#{link} : "
end
doc.listen:)characters, ["dc:date"]) do |date|
out_file.print "#{date} : "
end
doc.listen:)characters, ["dc:subject"]) do |subject|
out_file.puts "#{subject}"
end

doc.parse

end

Regards,
Pit
 
L

lgs

I'd like to thank you very much Pit,
that's working fine.

Bye Lgs

Luca g. Soave schrieb:


I'm new to Ruby and trying to write a stream in to a file,
but I can just get an empty one. I tryed in different way
found heare on the forum ( IO lib, Rio lib,
out_file << "#{doc.parse}" and so on ).
Here I show you the simplest :
file = File.new "lapatyXML.xml"
doc = REXML::parsers::SAX2Parser.new file
doc.listen:)characters, ["title"]) do |title|
print "\"#{title}\" : "
end
doc.listen:)characters, ["link"]) do |link|
print "#{link} : "
end
doc.listen:)characters, ["dc:date"]) do |date|
print "#{date} : "
end
doc.listen:)characters, ["dc:subject"]) do |subject|
puts "#{subject}"
end
File.open("outfile.xls","w") do |out_file|
out_file.write "#{doc.parse}"
end
------------------------------------------
Nothing seems to work, I just get an empty file "outfile.xls" .Luca, welcome to Ruby! I've never used REXML before, so all this might
be completely wrong, but with the line

out_file.write "#{doc.parse}"

you are writing the result of the #parse method to the output file,
which might be just an empty string if the result is nil. I think all
the calls of print and puts in your listeners just write to the console
where you run your script. To get what you want I would try to change
your program to:

require 'rexml/parsers/sax2parser'

file = File.new "lapatyXML.xml"
doc = REXML::parsers::SAX2Parser.new file

File.open("outfile.xls","w") do |out_file|

doc.listen:)characters, ["title"]) do |title|
out_file.print "\"#{title}\" : "
end
doc.listen:)characters, ["link"]) do |link|
out_file.print "#{link} : "
end
doc.listen:)characters, ["dc:date"]) do |date|
out_file.print "#{date} : "
end
doc.listen:)characters, ["dc:subject"]) do |subject|
out_file.puts "#{subject}"
end

doc.parse

end

Regards,
Pit
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,780
Messages
2,569,608
Members
45,244
Latest member
cryptotaxsoftware12

Latest Threads

Top