REXML : Erreur de création de fichier


#1

Bonjour,

j’ai une erreur que je ne parvient pas à expliquer, j’ai chopé ce bout
de code sur le net :

require “rexml/document”
include REXML # so that we don’t have to prefix everything with
# REXML::…

doc = REXML::Document.new File.new(“guitars.xml”)

root = doc.root

make = REXML::Element.new “make”
make.attributes[“name”] = “Gibson”

model = REXML::Element.new “model”
model.attributes[“sn”] = “99999999”
model.attributes[“year”] = “2007”
model.attributes[“country”] = “USA”

model.add_element “name”
model.elements[“name”].text = “SG”
model.add_element “price”
model.elements[“price”].text = “1250.00”
model.add_element “color”
model.elements[“color”].text = “Red”

make.add_element model

root.add_element make

-> Quand le document “guitars.xml” n’existe pas, je me prend une erreur
alors qu’il devrait se créer de lui-même :

test.rb:5:in initialize': No such file or directory - guitars.xml (Errno::ENOEN T) from test.rb:5:innew’
from test.rb:5

-> Si je le créé a la main et qu’il reste vide , une autre erreur se
produit :

c:/ruby/lib/ruby/1.8/rexml/source.rb:153:in readline': end of file reached (EOF Error) from c:/ruby/lib/ruby/1.8/rexml/source.rb:153:ininitialize’
from c:/ruby/lib/ruby/1.8/rexml/source.rb:16:in new' from c:/ruby/lib/ruby/1.8/rexml/source.rb:16:increate_from’
from c:/ruby/lib/ruby/1.8/rexml/parsers/baseparser.rb:130:in
stream=' from c:/ruby/lib/ruby/1.8/rexml/parsers/baseparser.rb:107:ininitialize

from c:/ruby/lib/ruby/1.8/rexml/parsers/treeparser.rb:8:in new' from c:/ruby/lib/ruby/1.8/rexml/parsers/treeparser.rb:8:ininitialize’
from c:/ruby/lib/ruby/1.8/rexml/document.rb:190:in new' from c:/ruby/lib/ruby/1.8/rexml/document.rb:190:inbuild’
from c:/ruby/lib/ruby/1.8/rexml/document.rb:45:in initialize' from test.rb:5:innew’
from test.rb:5

-> Enfin, si j’écris quelquechose à la main pour éviter de me prendre
direct une eof, voici ce qui m’est retourné :

test.rb:26: undefined method `add_element’ for nil:NilClass
(NoMethodError)

Voilà , si quelqu’un pouvait éclairer ma chandelle ca serait bien gentil,
parce que j’ai a tout prix besoin de créer un document XML pour mon
projet et je suis a deux doigts de tout faire a la main pour contourner
le problème.
Je vais aussi googlesier voir si il n’existe pas une autre librairie de
manip de xml pour ruby

D’avance merci


#2

Le 24/05/07, Fj Ritaine removed_email_address@domain.invalid a écrit :

Bonjour,

Bonjour,

j’ai une erreur que je ne parvient pas à expliquer, j’ai chopé ce bout

de code sur le net :

require “rexml/document”
include REXML # so that we don’t have to prefix everything with
# REXML::…

doc = REXML::Document.new File.new(“guitars.xml”)

Je me demande si c’est pas tout simplement un probléme dans le File.new,
en
effet je pense que le fichier est ouvert en lecture uniquement.

Utilser File.new(“guitar.xml”, “w+”) ne reglerais pas le probleme.

Voilà , si quelqu’un pouvait éclairer ma chandelle ca serait bien gentil,


#3

Je me demande si c’est pas tout simplement un probléme dans le File.new,
en
effet je pense que le fichier est ouvert en lecture uniquement.

Utilser File.new(“guitar.xml”, “w+”) ne reglerais pas le probleme.

Merci pour la réponse rapide !

Je viens de tester, maintenant le fichier se créé mais je me prend
toujours une erreur d’end of file au début du script :

c:/ruby/lib/ruby/1.8/rexml/source.rb:153:in readline': end of file reached (EOF Error) from c:/ruby/lib/ruby/1.8/rexml/source.rb:153:ininitialize’
from c:/ruby/lib/ruby/1.8/rexml/source.rb:16:in new' from c:/ruby/lib/ruby/1.8/rexml/source.rb:16:increate_from’
from c:/ruby/lib/ruby/1.8/rexml/parsers/baseparser.rb:130:in
stream=' from c:/ruby/lib/ruby/1.8/rexml/parsers/baseparser.rb:107:ininitialize

from c:/ruby/lib/ruby/1.8/rexml/parsers/treeparser.rb:8:in new' from c:/ruby/lib/ruby/1.8/rexml/parsers/treeparser.rb:8:ininitialize’
from c:/ruby/lib/ruby/1.8/rexml/document.rb:190:in new' from c:/ruby/lib/ruby/1.8/rexml/document.rb:190:inbuild’
from c:/ruby/lib/ruby/1.8/rexml/document.rb:45:in initialize' from test.rb:5:innew’
from test.rb:5

Une idée?


#4

Le 24/05/07, Fj Ritaineremoved_email_address@domain.invalid a écrit :

    from c:/ruby/lib/ruby/1.8/rexml/parsers/baseparser.rb:130:in

stream=' from c:/ruby/lib/ruby/1.8/rexml/parsers/baseparser.rb:107:ininitialize

Une idée?

Il ne manquerais pas un doc.parse ou quelque chose comme ça ?

Je dit ça car tu as ceci:

doc = REXML::Document.new File.new(“guitars.xml”)

root = doc.root

make = REXML::Element.new “make”
make.attributes[“name”] = “Gibson”

Qui implique qu’il existe déjà une balise ROOT (doc.root) dans ton fichier

hmmm
En relisant la pile d’erreur, ça a plutôt l’air de venir du File.new
… Un bug peut-être.

Sinon tu as le binding http://www.rubyxml.com/ mais qui dépends de
libxml2, donc unix (sauf si y’a une version pour windows, je n’ai pas
cherché).


Je vous serais reconnaissant de ne pas m’envoyer de pièces jointes
aux formats Wmv, Word, Excel, PowerPoint, RTF, fichiers aux formats
propriétaires.
Utilisez des formats universels et libres tels que texte, html,
OpenOffice.Org, TeX, à la limite PDF, Ogg. Merci.
Voir http://www.gnu.org/philosophy/no-word-attachments.fr.html


#5

Le 24/05/07, Fj Ritaine a écrit :

[snip]

Voilà, si quelqu’un pouvait éclairer ma chandelle ca serait
bien gentil, parce que j’ai a tout prix besoin de
créer un document XML
^^^^^^^^^^^^^^^^^^^^^^^^^
pour mon projet et je suis a deux doigts de
tout faire a la main pour contourner le problème.
Je vais aussi googlesier voir si il n’existe pas une autre
librairie de manip de xml pour ruby
^^^^^^^^^^^^^^^^^^^^^^^^^^

Ce n’est pas clair, tu veux créer un document XML
ou manipuler du XML ? (ie parser du XML, modifier un
document déjà existant).

Je te conseille :

1/ De relire le paragraphe “Describe the goal, not the step”
ici :
http://www.catb.org/~esr/faqs/smart-questions.html

Si ton objectif est de créer un fichier XML from scratch,
utilise plutôt Builder, c’est plus simple.

2/ De poser ta question dans un endroit
approprié,si ça n’a aucun rapport avec Rails et tout à voir avec
Ruby, demande de l’aide sur une liste Ruby (Rubyfrance public
par exemple :).

– Jean-François.


À la renverse.


#6

Mon but est effectivement de créer un fichier XML non existant.

Désolé pour l’endroit ou je poste mais je suis tombé sur ce forum en
cherchant une solution a mon problème et voyant l’url “ruby-forum.com
je n’ai pas réfléchi plus que ca, désolé.

Je vais donc regarder du cote de rubyxml.com alors, mais d’apres les
tuto que je trouve sur Internet, la création d’un fichier, de la manière
où je la tente doit fonctionner avec ReXML, personne ne l’utilise ?


#7

FJ Ritaine :

Mon but est effectivement de créer un fichier XML non existant.

Désolé pour l’endroit ou je poste mais je suis tombé sur ce forum en
cherchant une solution a mon problème et voyant l’url “ruby-forum.com
je n’ai pas réfléchi plus que ca, désolé.

Je vais donc regarder du cote de rubyxml.com alors,

Houlala, c’est ce qu’a conseillé Yannick, mais il te faut utiliser
la lib C libxml, c’est utiliser un marteau piqueur pour écraser
une mouche.

Avec Buider, c’est simple.

écrit à l’arrache en 2 minutes :

#!/usr/bin/env ruby

require ‘builder’

xml = Builder::XmlMarkup.new( :target => $stdout, :indent => 2)

xml.make :name => ‘Gibson’ do
xml.model :sn => ‘99999999’, :year => ‘2007’, :country => ‘USA’
xml.name ‘SG’
xml.price ‘1250’
xml.color ‘Red’
end

Pour le Google Group Ruby France pour parler de Ruby en
français, voir la page d’accueil http://www.rubyfrance.org
tout en bas.

– Jean-François.


membre du CA de Ruby France.
Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)


#8

libxml c’est super rapide. Avec REXML j’avais des perfs pitoyables. Et
libxml c’est super portable, super standard et il y a derrière libxml
une grosse expérience XML.
Et en plus maintenant j’ai le poil soyeux et les yeux brillants.

My 2 cts.

++

yk

Le 24/05/07, Jean-François Trânremoved_email_address@domain.invalid a écrit :


#9

merci pour vos réponses !!

Le je fais des essais avec Builder, ca a l’air de marcher pas mal, mais
dans ton exemple ca envoie sur $stdout, comment puis-je faire pour
envoyer dans un fichier ??

Libxml est utilisable sur windows ?? (la machine de développement sur
laquelle je travaille tourne sous windows)

Merci


#10

Fj Ritaine wrote:

merci pour vos réponses !!

Le je fais des essais avec Builder, ca a l’air de marcher pas mal, mais
dans ton exemple ca envoie sur $stdout, comment puis-je faire pour
envoyer dans un fichier ??

Libxml est utilisable sur windows ?? (la machine de développement sur
laquelle je travaille tourne sous windows)

Merci

edit : je viens de trouver une solution, construire le fichier dans une
string et ecrire ensuite la string dans le fichier. Y a t’il moyen
d’écrire direct dans le fichier ??

Vaut-il mieux que je reste sur Builder ou ke je tente avec libxml


#11

Fj Ritaine :

Le je fais des essais avec Builder, ca a l’air de marcher
pas mal, mais dans ton exemple ca envoie sur $stdout,
comment puis-je faire pour envoyer dans un fichier ??

Libxml est utilisable sur windows ?? (la machine de
développement sur laquelle je travaille tourne sous windows)

Merci

Bon, alors fais un peu attention, t’es en train de te transformer
en help vampire.

Je te rappelle quelques idées de base :

  • bien lire les réponses qu’on peut t’envoyer, la réponse
    à ta question y est peut-être cachée.
  • Google est ton ami.
  • La doc est ton amie.
  • La liste est ton amie (mais en dernier recours).

edit : je viens de trouver une solution, construire le fichier dans une
string et ecrire ensuite la string dans le fichier. Y a t’il moyen
d’écrire direct dans le fichier ??

As-tu lu la doc (qui est ton amie, je le rappelle) de Builder ?

Extrait de http://builder.rubyforge.org/ :

“XmlMarkup builds the markup in any object (called a target)
that accepts the << method. If no target is given, then XmlMarkup
defaults to a string target.”

donc là si on comprend pas tout de suite, on prend la peine
de réfléchir calmement 5 minutes sur ce que cela peut bien
signifier, sur les conséquences que ça implique, sur les
indications qui en découlent…

J’en profite pour signaler une autre chose, Rails contient
une version de Builder, on s’en sert notamment pour générer
du XML, du RSS ou de l’Atom typiquement. Il y a donc
des exemples de génération de RSS/XML dans le contexte
de rails
(avec tout ce que cela implique) avec Builder,
sur le Net, dans les livres sur Rails, etc.

donc je te laisse réfléchir et étudier tout ça.

Vaut-il mieux que je reste sur Builder ou ke je tente avec libxml

Je reformule ce que j’ai dit ou je le répéte, si on n’a pas besoin
de faire du DOM, XPath, XSLT, XBidule, parser du XML mais
juste de la génération basique de fichiers XML, Builder suffit
largement. Utiliser libxml2, ce serait un peu comme faire du
Jet-ski avec un porte-avions.

– Jean-François.


membre du CA de Ruby France.
Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)


#12

Jean-François Trân wrote:

Fj Ritaine :

Le je fais des essais avec Builder, ca a l’air de marcher
pas mal, mais dans ton exemple ca envoie sur $stdout,
comment puis-je faire pour envoyer dans un fichier ??

Libxml est utilisable sur windows ?? (la machine de
d�veloppement sur laquelle je travaille tourne sous windows)

Merci

Bon, alors fais un peu attention, t’es en train de te transformer
en help vampire.

Je te rappelle quelques id�es de base :

  • bien lire les r�ponses qu’on peut t’envoyer, la r�ponse
    � ta question y est peut-�tre cach�e.
  • Google est ton ami.
  • La doc est ton amie.
  • La liste est ton amie (mais en dernier recours).

edit : je viens de trouver une solution, construire le fichier dans une
string et ecrire ensuite la string dans le fichier. Y a t’il moyen
d’�crire direct dans le fichier ??

As-tu lu la doc (qui est ton amie, je le rappelle) de Builder ?

Extrait de http://builder.rubyforge.org/ :

“XmlMarkup builds the markup in any object (called a target)
that accepts the << method. If no target is given, then XmlMarkup
defaults to a string target.”

donc l� si on comprend pas tout de suite, on prend la peine
de r�fl�chir calmement 5 minutes sur ce que cela peut bien
signifier, sur les cons�quences que �a implique, sur les
indications qui en d�coulent…

J’en profite pour signaler une autre chose, Rails contient
une version de Builder, on s’en sert notamment pour g�n�rer
du XML, du RSS ou de l’Atom typiquement. Il y a donc
des exemples de g�n�ration de RSS/XML dans le contexte
de rails
(avec tout ce que cela implique) avec Builder,
sur le Net, dans les livres sur Rails, etc.

donc je te laisse r�fl�chir et �tudier tout �a.

Vaut-il mieux que je reste sur Builder ou ke je tente avec libxml

Je reformule ce que j’ai dit ou je le r�p�te, si on n’a pas besoin
de faire du DOM, XPath, XSLT, XBidule, parser du XML mais
juste de la g�n�ration basique de fichiers XML, Builder suffit
largement. Utiliser libxml2, ce serait un peu comme faire du
Jet-ski avec un porte-avions.

– Jean-Fran�ois.


membre du CA de Ruby France.
Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Merci pour les informations, mais nul n’est besoin de prendre un air
aussi condescendant deux fois de suite pour s’addresser à moi.

Si l’abondance de mes questions déplait, je préfère encore qu’on
s’abstienne de me répondre ou que mes messages soient modérés si il le
faut.

Contrairement à ce que tu sembles croire, je n’ai pas posté ici
directement parce que je veux savoir comment faire quelque chose mais
parce que j’ai essayé tout seul d’y arriver par plusieurs moyens et
qu’au bout d’une journée sans réussite, étant pris par le temps, j’ai
décidé de demander de l’aide à des “connaisseurs”, étant moi-même
débutant avec Ruby et Ruby on Rails.

Maintenant je reconnais avoir eu tort en postant dans cette section,
comme je l’ai dit tout à l’heure, je suis désolé, mais le thread étant
lancé et imaginant que mon problème serait facile à résoudre pour
quelqu’un qui connait je me suis dit “autant continuer sur celui ci”,
j’ai peut être eu tort, je m’en excuse.

Merci a tous pour vos réponses, je vais pouvoir avancer maintenant