From: Hans Meier Date: 2007-07-31T22:23:35+09:00 Subject: Re: parse xml file, put results in mysql db Robert Klemme wrote: > 2006/11/16, Kathy Simmons : >> doc = Document.new(scanfile) >> doc.elements.each("nmaprun/scaninfo") { |element| >> puts element.attributes["status state"] } >> >> # database insert >> dbname="nmap" >> m = Mysql.new("localhost", "root", "") >> dbh=DBI.connect("dbi:Mysql:nmap:localhost", "root", "") >> m.select_db(dbname) >> sth=dbh.prepare("INSERT INTO rawdata >> (file,tool,arguments,startime,version) VALUES (?,?,?,?,?)") >> sth.execute("scanfile.xml", "nmap", "${args}", "#{timeofscan}", >> "${version}"") > > You have a scoping problem: you set timeofscan etc. inside the block > when traversing the XML document. But they are not visible outside > the block and thus you likely get a NameError. > > If you want to insert multiple values into the DB you need to traverse > the XML doc and then execute for each iteration. > > I'd also use the block forms of your DB connection methods and file > handling in order to make sure connections are properly closed etc. > It's good to start that habit early. :-) > > Sample: > > doc = File.open('scanfile.xml', 'rb') {|scanfile| Document.new(scanfile) > } > > Kind regards > > robert Ok, thank you ! this way the code works: model = {} mobils.elements.each("MobileDevices/MobileDevice") { |element| puts element.attributes["model"] model = element.attributes["model"] } manufacturer = {} mobils.elements.each("MobileDevices/MobileDevice") { |element| puts element.attributes["manufacturer"] manufacturer = element.attributes["manufacturer"] } mobil_device_id = {} mobils.elements.each("MobileDevices/MobileDevice") { |element| puts element.attributes["id"] mobil_device_id = element.attributes["id"] } # db insert dbname="abo_development" m = Mysql.new("localhost", "root", "") dbh=DBI.connect("dbi:Mysql:abo_development:localhost", "root", "") m.select_db(dbname) sth=dbh.prepare("INSERT INTO mobile_devices (model, manufacturer, mobil_device_id) VALUES (?,?,?)") sth.execute("#{model}", "#{manufacturer}", "#{mobil_device_id}") sth.finish dbh.disconnect But there is one problem: it writes only one row in the database. Can anyone say why? -- Posted via http://www.ruby-forum.com/.