|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Hello, I am trying to get some simple create/update/delete xml-element to work with REXML, but I run into trouble when writing to file. Here's a code example: def save file = File.open(@@filePath, "r+") doc = Document.new(file) root = doc.root #create/update/delete elements in the root file.rewind formatter = REXML::Formatters: efault.new( 5 )formatter.write( doc, file) file.close end at first I was just adding and updating, and I noticed I needed to put the line: file.rewind or it would just append the root elements to the existing ones in the file, thereby creating doubles. Now that I have reached delete, I get the following behaviour: say the file contains: element_1 element_2 element_3 element_4 and I want to delete element_2, the result in the file is: element_1 element_3 element_4 element_4 to me, this: formatter.write( doc, file) implies that the entire xml doc would be written to the file, and as a result the file should only contain the doc (or the root of the doc), and nothing else. I am not very experienced in Ruby, and tried to resolve this way: def save file = File.open(@@filePath, "r+") doc = Document.new(file) root = doc.root file.close #create/update/delete elements in the root file = File.open(@@filePath, "w") formatter = REXML::Formatters: efault.new( 5 )formatter.write( doc, file) file.close end this works, but I feel there should be a better approach, because having to open the same file twice seems awkward . Thanks in advance, Rob -- Posted via http://www.ruby-forum.com/. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
2008/6/8 Rob Boellaard <rboell@tuparev.com>:
> > > > Hello, > > I am trying to get some simple create/update/delete xml-element to > work with REXML, but I run into trouble when writing to file. Here's a > code example: > > def save > file = File.open(@@filePath, "r+") > doc = Document.new(file) > root = doc.root > > > #create/update/delete elements in the root > > file.rewind > formatter = REXML::Formatters: efault.new( 5 )> formatter.write( doc, file) > file.close > > end > > at first I was just adding and updating, and I noticed I needed to put > the line: > file.rewind > or it would just append the root elements to the existing ones in the > file, thereby creating doubles. > Now that I have reached delete, I get the following behaviour: > > say the file contains: > > element_1 > element_2 > element_3 > element_4 > > and I want to delete element_2, the result in the file is: > > element_1 > element_3 > element_4 > element_4 > > > > to me, this: > formatter.write( doc, file) > implies that the entire xml doc would be written to the file, and as a > result the file should only contain the doc (or the root of the doc), > and nothing else. > > I am not very experienced in Ruby, and tried to resolve this way: > > def save > file = File.open(@@filePath, "r+") > doc = Document.new(file) > root = doc.root > file.close > > #create/update/delete elements in the root > > file = File.open(@@filePath, "w") > formatter = REXML::Formatters: efault.new( 5 )> formatter.write( doc, file) > file.close > > end > > > this works, but I feel there should be a better approach, because > having to open the same file twice seems awkward . > > Thanks in advance, IMHO you need to seek and truncate the file when opened in rw mode. Otherwise you do not have control about where the document is written. Since you are first reading it it is likely that the new content simply gets appended. HTH Kind regards robert -- use.inject do |as, often| as.you_can - without end |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Rob Boellaard <rboell@tuparev.com> wrote:
> I am trying to get some simple create/update/delete xml-element to > work with REXML, but I run into trouble when writing to file. Here's a > code example: instead of using rexml, I'd suggest you 'xml/smart' which as a "modify" method. for example I'm using : XML::Smart.modify( "#{file}" ) do | doc | node=doc.root.find("//xhtml:p[@id = 'maj']", {"xhtml" => "http://www.w3.org/1999/xhtml"}).first if node node.text=File.stat("#{file}").mtime.strftime("màj le %d %m %y %H:%M") puts "file '#{file}' updated!" else puts "No node \"//xhtml:p[@id = 'maj']\" for file '#{file}'!" end end in order to modify the date (writen in <p id='maj'><</p>) from file's mtime. -- Une Bévue |
|
![]() |
| Outils de la discussion | |
|
|