Partage
  • Partager sur Facebook
  • Partager sur Twitter

<SAX> Problème d'entités XML dans parseur

    11 août 2010 à 19:10:40

    Salut à tous !
    J'ai créé un parseur XML grâce à <acronym title="Simple API for XML">SAX</acronym> pour un langage semblable au zCode.

    Cependant, j'ai un problème :
    Si l'utilisateur entre des caractères réservés à XML (<, >, &), ça bug.
    Il faudrait que je les transforme en entités XML (&lt; , &gt; , &amp; ) avant de parser le XML.

    Petit problème, par contre.
    Si j'utilise une regexp comme :
    chaine = sub('<', '&lt;', chaine)
    

    ça va également modifié les balises, car chaine (le texte de l'utilisateur) en contient (ou peut en contenir plutôt).

    Alors, connaissez-vous un moyen de régler ce problème ?

    Merci d'avance pour votre aide.

    Si vous avez besoin de code, allez voir sur le sujet de mon autre problème relié à SAX, où vous trouverez mon parseur XML.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      11 août 2010 à 19:58:06

      Je crois que ton problème doit être résolue dans les dicos des balises... "&lt;gras&gt;" : "<strong>"

      Après, je n'ai pas vraiment lus ton code entièrement... :'(
      • Partager sur Facebook
      • Partager sur Twitter
        11 août 2010 à 20:09:17

        Le problème, c'est que SAX ne prend pas &lt;gras&gt; comme une balise...
        Donc, la fonction de parsage ne sera pas appelée.

        Je viens de trouver une fonction qui échappe les caractères :
        xml.sax.saxutils()

        Mais, <gras>gras</gras> se transformera en &lt;gras&gt;gras&lt;/gras&gt; et SAX ne le prend donc pas comme balise.

        Il faudrait trouvé un moyen d'échapper seulement les caractères qui ne font pas partie des balises.

        Avez-vous une autre idée ?

        Merci d'avance pour votre aide.
        • Partager sur Facebook
        • Partager sur Twitter
          18 août 2010 à 3:01:13

          Salut à tous !
          J’ai trouvé une solution, mais elle est moche…

          Il s’agit d’une grande regexp du genre :
          chaine = sub('<(?!/?(gras|italique|…)>)', '&lt;', chaine)
          

          pour enlever seulement les entités < et > lorsque qu’ils ne font pas partie d’une balise.

          Est-ce que vous auriez une meilleure idée ?

          Merci pour votre aide.
          • Partager sur Facebook
          • Partager sur Twitter
            18 août 2010 à 11:24:15

            Le module saxutils contient bien les fonctions dont tu as besoin :
            >>> from xml.sax.saxutils import unescape, escape
            >>> s = escape('<gras>')
            >>> s
            '&lt;gras&gt;'
            >>> unescape(s)
            '<gras>'
            


            Plus d'infos sur cette page du wiki python.

            Ça te permettra de parser ton code avec sax puisqu'il pourra reconnaître les balises.
            • Partager sur Facebook
            • Partager sur Twitter
            Zeste de Savoir, le site qui en a dans le citron !
              18 août 2010 à 14:50:38

              Salut.
              Merci pour ta réponse.

              Cependant, je ne comprends pas comment m’y prendre, même avec ces fonctions.

              La chaîne postée peut contenir à la fois des balises et des caractères spéciaux.

              Or, avec ces fonctions, tous les <, > et & seront échappés même s’ils font partie d’une balise.

              Le problème reste alors le même puisque je ne peux toujours pas faire la différence entre le < d’une balise ou le < en dehors d’une balise.

              Est-ce qu’il y aurait un moyen de faire en sorte que unescape n’agisse que sur les &lt; et &gt; d’une balise ?

              Ou bien, y aurait-il une autre solution ?

              Merci d’avance.
              • Partager sur Facebook
              • Partager sur Twitter
                18 août 2010 à 14:59:51

                Tu parses ton langage à la main ou tu utilises un truc du genre SAX, DOM, ElementTree ?
                Dans le second cas, ça m'étonne que le parser ne gère pas ce genre de choses nativement...
                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  18 août 2010 à 15:03:53

                  Ça résout pas directement ton problème, mais perso pour parser du xml ou html crado, j'utilise lxml, et ça marche plutôt bien.

                  http://codespeak.net/lxml/lxmlhtml.html#parsing-html

                  Bon, par contre c'est plus "DOM-like" que "SAX-like", car il me semble que le parseur en question produit une représentation du code en mémoire, donc c'est un peu lourd si tu as besoin de parser de gros documents.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Blond, bouclé, toujours le sourire aux lèvres...

                    18 août 2010 à 16:25:39

                    J’utilise SAX, mais je dois envoyer une chaîne au parseur qui, lui, doit avoir des balises entourées de < et > sinon il ne « verra » pas les balises.

                    SAX appelle des méthodes lorsqu’il « voit » des balises.
                    C’est pourquoi escape ne fonctionne pas…

                    Croyez-vous qu’il existe un autre moyen que ma regexp ?

                    Merci d’avance pour votre aide.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    <SAX> Problème d'entités XML dans parseur

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown