Overwrite a File (rexml)

Discussion in 'Ruby' started by Rob Boellaard, Jun 8, 2008.

  1. 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::Default.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::Default.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/.
    Rob Boellaard, Jun 8, 2008
    #1
    1. Advertising

  2. 2008/6/8 Rob Boellaard <>:
    >
    >
    >
    > 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::Default.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::Default.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
    Robert Klemme, Jun 9, 2008
    #2
    1. Advertising

  3. Rob Boellaard

    Une Bévue Guest

    Rob Boellaard <> 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
    Une Bévue, Jun 9, 2008
    #3
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. John Harrison

    Re: file overwrite data manipulation

    John Harrison, Jun 26, 2003, in forum: C++
    Replies:
    2
    Views:
    5,953
    John Harrison
    Jun 27, 2003
  2. Chris Theis
    Replies:
    0
    Views:
    807
    Chris Theis
    Jun 26, 2003
  3. Damphyr
    Replies:
    2
    Views:
    137
    Damphyr
    Jul 16, 2003
  4. Daniel Berger

    rexml error - REXML::Validation

    Daniel Berger, Oct 12, 2004, in forum: Ruby
    Replies:
    2
    Views:
    151
    Henrik Horneber
    Oct 12, 2004
  5. Phlip
    Replies:
    0
    Views:
    140
    Phlip
    Jan 15, 2008
Loading...

Share This Page