Nokogiri

15 views
Skip to first unread message

Frédérick Sauvage

unread,
Nov 10, 2011, 5:41:26 AM11/10/11
to RubyFR public
Bonjour,

Je me permets de laisser un message car je rencontre un difficulté
avec Nokogiri et l'UTF-8.
Afin d'enregistrer mes données dans un xml, je suis tombé sur ce petit
tutoriel : http://www.geckogeek.fr/nokogiri-le-parseur-xml-sexy-de-ruby.html
Jusque là, pas trop de problème, sauf lorsque j'ai voulu enregistrer
des caractères accentués. Comme l'indique le message que j'y ai
laissé :

data="toto"
textNode = @@letter.createANewNode('text')
@@letter.addText(textNode, data)
# C A D : textNode.content = data.to_s
@@letter.insertAChildNode(myNewChildNode, textNode)

ne me cause aucun problème mais

data="zoé"
textNode = @@letter.createANewNode('text')
@@letter.addText(textNode, data)
# C A D : textNode.content = data.to_s
@@letter.insertAChildNode(myNewChildNode, textNode)

ne me renvoie aucune erreur (j'ai mis un rescue) mais me retourne un
fichier xml vide.

Merci d'avance pour votre aide.





Frédéric

Alexandre Friquet

unread,
Nov 10, 2011, 6:05:18 AM11/10/11
to rubyfr...@googlegroups.com
Bonjour,

Le 10 novembre 2011 11:41, Frédérick Sauvage
<frederic...@gmail.com> a écrit :


> ne me renvoie aucune erreur (j'ai mis un rescue) mais me retourne un
> fichier xml vide.

Commencer par enlever le "rescue" et voir qu'elle est l'erreur exacte
puis Google et/ou ici ;)

--
Alex

Jeremy Dierx

unread,
Nov 10, 2011, 6:22:33 AM11/10/11
to rubyfr...@googlegroups.com


Si tu utilises ruby 1.9.2 pense à ajouter

# coding: utf-8

au début de ton fichier .rb

J

--
"The Internet? Is that thing still around?"
Homer Simpson

Frédérick Sauvage

unread,
Nov 10, 2011, 6:35:30 AM11/10/11
to rubyfr...@googlegroups.com
Ligne déjà présente


--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes RubyFR public.
Pour envoyer un message à ce groupe, adressez un e-mail à rubyfr...@googlegroups.com.
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse rubyfr-publi...@googlegroups.com.
Pour plus d'options, consultez la page de ce groupe : http://groups.google.com/group/rubyfr-public?hl=fr




--
SAUVAGE Frédéric

ArchiveXML.rb

Ollivier Robert

unread,
Nov 10, 2011, 7:43:21 AM11/10/11
to rubyfr...@googlegroups.com
According to Jeremy Dierx:

> Si tu utilises ruby 1.9.2 pense à ajouter
>
> # coding: utf-8
>
> au début de ton fichier .rb

Il faut différencier l'encodage du script des jeux de caractères qu'il manipule mais tout passer en UTF-8 dès le départ est un bon début...

1.9.3 est sortie au fait, à préférer à 1.9.2 (et a fiotiori à 1.9.1)…

--
Ollivier ROBERT -=- FreeBSD: The Power to Serve! -=- rob...@keltia.net
In memoriam to Ondine, our 2nd child: http://ondine.keltia.net/

Ollivier Robert

unread,
Nov 10, 2011, 7:47:06 AM11/10/11
to rubyfr...@googlegroups.com
According to Frᅵdᅵrick Sauvage:
> data="zoᅵ"

> textNode = @@letter.createANewNode('text')
> @@letter.addText(textNode, data)
> # C A D : textNode.content = data.to_s
> @@letter.insertAChildNode(myNewChildNode, textNode)

Est-ce que tu es sur que le "ᅵ" est bien en UTF-8 ?

Frédérick Sauvage

unread,
Nov 10, 2011, 8:07:07 AM11/10/11
to rubyfr...@googlegroups.com
Le "zoé" est un test, en fait, j'ai "âddf".

Et en effet, en console, je lis "zoé"

Le 10 novembre 2011 13:47, Ollivier Robert <rob...@keltia.freenix.fr> a écrit :
According to Frédérick Sauvage:
> data="zoé"

> textNode = @@letter.createANewNode('text')
> @@letter.addText(textNode, data)
> # C A D : textNode.content = data.to_s
> @@letter.insertAChildNode(myNewChildNode, textNode)

Est-ce que tu es sur que le "é" est bien en UTF-8 ?

--
Ollivier ROBERT -=- FreeBSD: The Power to Serve! -=- rob...@keltia.net
In memoriam to Ondine, our 2nd child: http://ondine.keltia.net/

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes RubyFR public.
Pour envoyer un message à ce groupe, adressez un e-mail à rubyfr...@googlegroups.com.
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse rubyfr-publi...@googlegroups.com.
Pour plus d'options, consultez la page de ce groupe : http://groups.google.com/group/rubyfr-public?hl=fr




--
SAUVAGE Frédéric

Ollivier Robert

unread,
Nov 10, 2011, 8:19:14 AM11/10/11
to Frédérick Sauvage, rubyfr...@googlegroups.com
According to Frédérick Sauvage:

> Et en effet, en console, je lis "zoé"

La console n'est donc pas en UTF-8 mais en une variation sur Latin1 ou 9. Ruby utilise également la locale pour essayer d'interprêter ce qu'on lui fourgue. Essaie de passer complètement en UTF-8 déjà.

On en revient toujours à ce que je dis depuis des années sur ruby-talk, m17n et la manière de faire de Ruby 1.9 est d'une complexité inutile…

Frédérick Sauvage

unread,
Nov 10, 2011, 8:40:47 AM11/10/11
to RubyFR public
J'ai changé ma console et j'ai toujours le même souci, mon xml est
vide avec "zoé" (ou autre chaîne accentuée ... et vu qu'il s'agira du
contenu d'un message, ils seront souvent accentués) mais pas de
problème avec "toto"

On 10 nov, 14:19, Ollivier Robert <robe...@keltia.freenix.fr> wrote:
> According to Frédérick Sauvage:
>
> > Et en effet, en console, je lis "zoé"
>
> La console n'est donc pas en UTF-8 mais en une variation sur Latin1 ou 9. Ruby utilise également la locale pour essayer d'interprêter ce qu'on lui fourgue. Essaie de passer complètement en UTF-8 déjà.
>
> On en revient toujours à ce que je dis depuis des années sur ruby-talk, m17n et la manière de faire de Ruby 1.9 est d'une complexité inutile…
>
> --
> Ollivier ROBERT -=- FreeBSD: The Power to Serve! -=- robe...@keltia.net

Matt Aimonetti

unread,
Nov 10, 2011, 9:57:22 AM11/10/11
to rubyfr...@googlegroups.com
http://nokogiri.org/Nokogiri/XML.html

A mon avis c'est un probleme ds ton code. Je peux te garantir que Nokogiri gere ters bien l'utf8.

"Encoding
Strings are always stored as UTF-8 internally. Methods that return text values will always return UTF-8 encoded strings. Methods that return XML (like to_xml, to_html and inner_html) will return a string encoded like the source document."





2011/11/10 Frédérick Sauvage <frederic...@gmail.com>

Frédérick Sauvage

unread,
Nov 10, 2011, 10:09:41 AM11/10/11
to rubyfr...@googlegroups.com
Je veux bien croire que c'est un problème dans mon code
Le problème étant que je ne trouve pas ce problème.
J'ai "triché" avec CGI::escape
--
SAUVAGE Frédéric

33A.gif

Ollivier Robert

unread,
Nov 10, 2011, 10:20:38 AM11/10/11
to rubyfr...@googlegroups.com
According to Frᅵdᅵrick Sauvage:
> Je veux bien croire que c'est un problᅵme dans mon code [?]
> Le problᅵme ᅵtant que je ne trouve pas ce problᅵme.
> J'ai "trichᅵ" avec CGI::escape

Le problᅵme de notre cᅵtᅵ est que tu n'as envoyᅵ qu'un extrait trᅵs partiel dudit code donc il est difficile de comprendre oᅵ ᅵa merde.

--
Ollivier ROBERT -=- FreeBSD: The Power to Serve! -=- rob...@keltia.net

Frédérick Sauvage

unread,
Nov 10, 2011, 10:41:53 AM11/10/11
to rubyfr...@googlegroups.com
Pourtant j'ai envoyé les codes en pièces jointes (je reverrai cela lundi)

Le 10 novembre 2011 16:20, Ollivier Robert <rob...@keltia.freenix.fr> a écrit :
According to Frédérick Sauvage:
> Je veux bien croire que c'est un problème dans mon code [?]

> Le problème étant que je ne trouve pas ce problème.
> J'ai "triché" avec CGI::escape

Le problème de notre côté est que tu n'as envoyé qu'un extrait très partiel dudit code donc il est difficile de comprendre où ça merde.


--
Ollivier ROBERT -=- FreeBSD: The Power to Serve! -=- rob...@keltia.net
In memoriam to Ondine, our 2nd child: http://ondine.keltia.net/

--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes RubyFR public.
Pour envoyer un message à ce groupe, adressez un e-mail à rubyfr...@googlegroups.com.
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse rubyfr-publi...@googlegroups.com.
Pour plus d'options, consultez la page de ce groupe : http://groups.google.com/group/rubyfr-public?hl=fr




--
SAUVAGE Frédéric

Thibaut Barrère

unread,
Nov 10, 2011, 11:33:18 AM11/10/11
to rubyfr...@googlegroups.com
Pourtant j'ai envoyé les codes en pièces jointes (je reverrai cela lundi)

je regarderai de plus près - as-tu envoyé la totalité du code pour reproduire? (tu ne lis pas un fichier xml externe etc?)

-- Thibaut

Matt Aimonetti

unread,
Nov 10, 2011, 10:18:27 AM11/10/11
to rubyfr...@googlegroups.com, rubyfr...@googlegroups.com
Je regarderai ce soir, tu as tout le code et les fichiers XML qque part en ligne?

-m
Sent from my iPhone

On Nov 10, 2011, at 12:09, Frédérick Sauvage <frederic...@gmail.com> wrote:

Je veux bien croire que c'est un problème dans mon code <33A.gif>

Frédérick Sauvage

unread,
Nov 14, 2011, 8:32:50 AM11/14/11
to rubyfr...@googlegroups.com
Je récupère les informations via d'autres fonctions internes à l'application.

Pour le moment, j'ai remplacé via CGI::

Et ma fonction devient :

def self.create_archive(letter_id)
    # On récupère les données de l'objet Letter
    # On met ces infos dans un XML grace à XMLNokogiri
    details = Letter.get_letter_details(letter_id)
    LOGGER.debug("details : "+ details.to_s)

    if @@letter.nil?
      begin
        fichier = File.open("#{Rails.root}/default_log.xml", "w")
      rescue
        fichier = File.new("#{Rails.root}/default_log.xml", "w")
      end

    end
    begin
      # Load the XML doc
      @@letter = XMLNokogiri.new("#{Rails.root}/default_log.xml")
      # We create a new doc and save it at the place of the old one (yeah, it's just to test eh :p)
      @@letter.myDoc = @@letter.createANewDoc()

=begin
              Pour info :
                    letter_content_hash = LetterContent.export_to_hash(letter.letter_content_id)
                    attachments_list = Attachment.getAttachmentsArray(letter_id)
                    signatures_list = Attachment.getSignatureArray(attachments_list)
                    letter_hash = {
                      :sender_id => LetterActor.get_letter_sender(letter_id),
                      :recipient_ids => LetterActor.get_letter_recipients_ids(letter_id),
                      :constraints => letter.constraints, #V2
                      :origin_id => letter.origin_id,
                      :events_list => LetterActor.get_letter_events_list(letter_id).reverse,
                      :letter_attachments => attachments_list,
                      :letter_signatures => signatures_list
                    }
                    letter_hash = letter_hash.merge(get_letter_preview(letter_id))
=end

      myNewNode = @@letter.createANewNode('meta')
      @@letter.addAnAttribute(myNewNode, 'equiv', "content-type")
      @@letter.addAnAttribute(myNewNode, 'content', "text/html; charset=UTF-8")
      @@letter.addARootNode(myNewNode)

      myNewNode = @@letter.createANewNode('letter_id')
      @@letter.addAnAttribute(myNewNode, 'id', letter_id.to_s)
      @@letter.addARootNode(myNewNode)

      myNewChildNode = @@letter.createANewNode('version')
      @@letter.addText(myNewChildNode, "1.0")
      @@letter.insertAChildNode(myNewNode, myNewChildNode)

      myNewChildNode = @@letter.createANewNode('content')
      @@letter.insertAChildNode(myNewNode, myNewChildNode)

      myNewChildNode = @@letter.searchNode('//content')


      textNode = @@letter.createANewNode('text')
      @@letter.addText(textNode, CGI::escape(details[:text].to_s))
      @@letter.insertAChildNode(myNewChildNode, textNode)

      sizeNode = @@letter.createANewNode('size')
      @@letter.addText(sizeNode, CGI::escape(details[:size].to_s))
      @@letter.insertAChildNode(myNewChildNode, sizeNode)

      @@letter.insertAChildNode(myNewNode, myNewChildNode)

      myNewChildNode = @@letter.createANewNode('sender_id')
      @@letter.addText(myNewChildNode, CGI::escape(details[:sender_id].to_s))
      @@letter.insertAChildNode(myNewNode, myNewChildNode)

      i_recipient_ids = 1

      for recipient_id in details[:recipient_ids]
        myNewChildNode = @@letter.createANewNode('recipient_id')
        @@letter.addAnAttribute(myNewChildNode, 'num', i_recipient_ids.to_s)
        recipient = User.first(:conditions => {:_id => recipient_id.to_s})
        recipient &&= recipient.identifier
        @@letter.addText(myNewChildNode, CGI::escape(recipient.to_s))
        @@letter.insertAChildNode(myNewNode, myNewChildNode)
      end

      myNewChildNode = @@letter.createANewNode('origin_id')
      @@letter.addText(myNewChildNode, CGI::escape(details[:origin_id].to_s))
      @@letter.insertAChildNode(myNewNode, myNewChildNode)

      #TODO : Vérifier ce que contient events_list et ce qu'on souhaite y mettre dans le fichier d'archive
      myNewChildNode = @@letter.createANewNode('events_list')
      @@letter.addText(myNewChildNode, CGI::escape(details[:events_list].to_s))
      @@letter.insertAChildNode(myNewNode, myNewChildNode)

=begin
              Pour info :
              :_id => letter._id.to_s ,
              :letter_type_id => letter.letter_type_id,
              :subject => letter.title ,
              :date => Toolbox.convert_Time_into_Hash(sending_date),
              :has_attachment => has_attachment
=end

      myNewChildNode = @@letter.createANewNode('letter_type')
      letter_type = LetterType.first(:conditions => {:_id => details[:letter_type_id].to_s})
      letter_type &&= letter_type.description_code
      @@letter.addText(myNewChildNode, CGI::escape(letter_type.to_s))
      @@letter.insertAChildNode(myNewNode, myNewChildNode)

      myNewChildNode = @@letter.createANewNode('subject')
      @@letter.addText(myNewChildNode, CGI::escape(details[:subject].to_s))
      @@letter.insertAChildNode(myNewNode, myNewChildNode)

      myNewChildNode = @@letter.createANewNode('date')
      @@letter.addText(myNewChildNode, CGI::escape(details[:date].to_s))
      @@letter.insertAChildNode(myNewNode, myNewChildNode)

      myNewChildNode = @@letter.createANewNode('has_attachment')
      @@letter.addText(myNewChildNode,CGI::escape(details[:has_attachment].to_s))
      @@letter.insertAChildNode(myNewNode, myNewChildNode)

      nameXML = "LegalBox_Letter_"+letter_id.to_s+"_time_"+Time.now().to_f.to_s+".xml"

      @@letter.saveToFile(nameXML)

  end
Reply all
Reply to author
Forward
0 new messages