Maison  >  Article  >  développement back-end  >  Tutoriel pratique sur la combinaison de Python et XML

Tutoriel pratique sur la combinaison de Python et XML

php中世界最好的语言
php中世界最好的语言original
2018-04-09 14:34:541195parcourir

Cette fois, je vais vous proposer un tutoriel pratique sur la combinaison de python et XML. Quelles sont les précautions pour combiner python et XML. Voici des cas pratiques, jetons un coup d'œil.

Le nom de ce projet ne s'appelle pas XML universel, il vaut mieux l'appeler construction automatique de site Web. Sur la base d'un fichier XML, un site Web correspondant à la structure de répertoires est généré. , seul le HTML est encore trop simple. Il serait plus puissant s'il pouvait générer du CSS ensemble. Cela doit être développé à l’avenir. Étudions d’abord comment structurer le site Web HTML. Étant donné que le site Web est généré via une structure XML, tout doit provenir de ce fichier XML. Jetons d'abord un coup d'œil à ce fichier XML, website.xml :

<website>
 <page name="index" title="Home page">
 <h1>Welcome to my Home page</h1>
 <p>Hi, there. My name is Mr.gumby,and this is my home page,here are some of my int:</p>
 <ul>
  <li><a href="interests/shouting.html" rel="external nofollow" >Shouting</a></li>
  <li><a href="interests/sleeping.html" rel="external nofollow" >Sleeping</a></li>
  <li><a href="interests/eating.html" rel="external nofollow" >Eating</a></li>
 </ul>
 </page>
 <directory name="interests">
  <page name="shouting" title="Shouting">
   <h1>shouting page</h1>
   <p>....</p>
  </page>
  <page name="sleeping" title="Sleeping">
   <h1>sleeping page</h1>
   <p>...</p>
  </page>
  <page name="eating" title="Eating">
    <h1>Eating page</h1>
    <p>....</p>
  </page>
 </directory>
</website>

Avec ce fichier, voyons comment générer un site Web via ce fichier.

Nous devons d'abord analyser ce fichier XML. Python analyse XML de la même manière qu'en Java. Il existe deux manières, SAX et DOM. La différence entre les deux méthodes de traitement est la vitesse et la portée. Seule une petite partie du document est traitée à la fois, ce qui permet d'utiliser la mémoire rapidement et efficacement. Cette dernière méthode de traitement consiste d'abord à charger tous les documents dans la mémoire, puis à les traiter. plus de mémoire. Le seul avantage est que vous pouvez manipuler l'intégralité du document.

Pour utiliser sax pour traiter du XML en python, vous devez d'abord introduire la fonction d'analyse dans xml.sax et le ContentHandler dans xml.sax.handler. Cette dernière classe est utilisée en conjonction avec la fonction d'analyse. L'utilisation est la suivante : parse('xxx.xml',xxxHandler), le xxxHandler ici doit hériter du ContentHandler ci-dessus, mais il suffit d'en hériter, pas besoin de faire quoi que ce soit. Ensuite, lorsque la fonction d'analyse traite le fichier XML, elle appellera la fonction startElement et la fonction endElement dans xxxHandler pour démarrer et terminer la balise en XML. Le processus intermédiaire utilise une fonction nommée caractères pour traiter toutes les chaînes à l'intérieur de la balise.

Avec la compréhension ci-dessus, nous savons déjà comment traiter les fichiers XML, puis examiner le fichier website.xml, la source du mal, et analyser sa structure. Il n'y a que deux nœuds : la page et le répertoire. Il est évident que page Représente une page, directory représente un répertoire.

L'idée de traiter ce fichier XML devient donc claire. Lisez chaque nœud du fichier XML, puis déterminez s'il s'agit d'une page ou d'un répertoire. S'il s'agit d'une page, créez une page HTML, puis écrivez le contenu du nœud dans le fichier. Si un répertoire est rencontré, créez un dossier, puis traitez le nœud de page qu'il contient (s'il existe).
Regardons cette partie du code. L'implémentation dans le livre est plus complexe et flexible. Examinons-le d’abord, puis analysons-le.

from xml.sax.handler import ContentHandler
from xml.sax import parse
import os
class Dispatcher:
    def dispatch(self, prefix, name, attrs=None):
        mname = prefix + name.capitalize()
        dname = 'default' + prefix.capitalize()
        method = getattr(self, mname, None)
        if callable(method): args = ()
        else:
            method = getattr(self, dname, None)
            args = name,
        if prefix == 'start': args += attrs,
        if callable(method): method(*args)
    def startElement(self, name, attrs):
        self.dispatch('start', name, attrs)
    def endElement(self, name):
        self.dispatch('end', name)
class WebsiteConstructor(Dispatcher, ContentHandler):
    passthrough = False
    def init(self, directory):
        self.directory = [directory]
        self.ensureDirectory()
    def ensureDirectory(self):
        path = os.path.join(*self.directory)
        print path
        print '----'
        if not os.path.isdir(path): os.makedirs(path)
    def characters(self, chars):
        if self.passthrough: self.out.write(chars)
    def defaultStart(self, name, attrs):
        if self.passthrough:
            self.out.write('<&#39; + name)
            for key, val in attrs.items():
                self.out.write(&#39; %s="%s"&#39; %(key, val))
            self.out.write(&#39;>')
    def defaultEnd(self, name):
        if self.passthrough:
            self.out.write('</%s>' % name)
    def startDirectory(self, attrs):
        self.directory.append(attrs['name'])
        self.ensureDirectory()
    def endDirectory(self):
        print 'endDirectory'
        self.directory.pop()
    def startPage(self, attrs):
        print 'startPage'
        filename = os.path.join(*self.directory + [attrs['name']+'.html'])
        self.out = open(filename, 'w')
        self.writeHeader(attrs['title'])
        self.passthrough = True
    def endPage(self):
        print 'endPage'
        self.passthrough = False
        self.writeFooter()
        self.out.close()
    def writeHeader(self, title):
        self.out.write('<html>\n <head>\n  <title>')
        self.out.write(title)
        self.out.write('</title>\n </head>\n <body>\n')
    def writeFooter(self):
        self.out.write('\n </body>\n</html>\n')
parse('website.xml',WebsiteConstructor('public_html'))

Il semble que l'analyse de ce programme soit un peu plus compliquée, mais le grand homme Maomao a dit que tout programme complexe est un tigre de papier. Alors analysons à nouveau ce programme.

Tout d'abord, j'ai vu que ce programme a deux classes. En fait, il peut être considéré comme une seule classe en raison de l'héritage.

Ensuite, regardons ce qu'il contient. En plus des startElement, endElement et des caractères que nous avons analysés, il y a aussi startPage, startDirectory, endDirectory; EnsureDirectory; . ces fonctions. À l'exception de la répartition, les fonctions précédentes sont faciles à comprendre. Chaque paire de fonctions traite simplement la balise html et le nœud XML correspondants. La répartition est plus compliquée. La complexité réside dans le fait qu'elle est utilisée pour combiner dynamiquement des fonctions et les exécuter.

L'idée de traitement de la répartition est d'abord de déterminer s'il existe une fonction correspondante telle que startPage en fonction des paramètres transmis (c'est-à-dire le nom de l'opération et le nom du nœud). Si elle n'existe pas, exécutez-la. le nom par défaut + de l'opération : tel que defaultStart.

Après avoir compris chaque fonction une par une, vous saurez à quoi ressemble l'ensemble du flux de traitement. Créez d'abord un fichier public_html pour stocker l'intégralité du site Web, puis lisez les nœuds XML et appelez dispatch via startElement et endElement pour le traitement. Ensuite, il y a la façon dont dispatch appelle la fonction de traitement spécifique. À ce stade, l’analyse de ce projet est terminée.

Le contenu principal à maîtriser est l'utilisation de SAX pour traiter du XML en python, et l'autre est l'utilisation des fonctions en python, comme getattr, les astérisques lors du passage des paramètres...

Je pense que vous avez lu cet article. Vous maîtrisez la méthode des cas. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web PHP chinois !

Lecture recommandée :

Comment écrire des données dans un bloc de données dans la base de données en Python

Cycle de vie des objets dans Réplication Python Comment utiliser

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn