Maison >développement back-end >Tutoriel Python >tutoriel de base python projet trois XML universel

tutoriel de base python projet trois XML universel

不言
不言original
2018-04-03 09:21:561722parcourir

Cet article présente principalement en détail les trois XML universels du projet de didacticiel de base Python, qui ont une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Le nom de ce projet est appelé XML universel, il est préférable de l'appeler. construire automatiquement un site Web Sur la base d'un fichier XML, un site Web avec une structure de répertoires correspondante est généré. Cependant, seul le HTML est encore trop simple. Il serait plus puissant s'il pouvait également générer du CSS. 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. Regardons d'abord 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 le générer via ce fichier website .

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. se concentre sur l'efficacité, ne traitant qu'une petite partie du document à la fois, en utilisant la mémoire rapidement et efficacement. Cette dernière est la méthode de traitement opposée, chargeant d'abord tous les documents dans la mémoire, puis le traitement, qui est plus lent et plus consommateur. Le seul avantage de la mémoire est qu'elle peut exploiter 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 doit coopérer avec la fonction d'analyse. . utilisé. 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 : page. et répertoire. Évidemment, page représente une page et répertoire 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 = &#39;default&#39; + prefix.capitalize()
        method = getattr(self, mname, None)
        if callable(method): args = ()
        else:
            method = getattr(self, dname, None)
            args = name,
        if prefix == &#39;start&#39;: args += attrs,
        if callable(method): method(*args)
    def startElement(self, name, attrs):
        self.dispatch(&#39;start&#39;, name, attrs)
    def endElement(self, name):
        self.dispatch(&#39;end&#39;, 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 &#39;----&#39;
        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;<&#39; + name)
            for key, val in attrs.items():
                self.out.write(&#39; %s="%s"&#39; %(key, val))
            self.out.write(&#39;>&#39;)
    def defaultEnd(self, name):
        if self.passthrough:
            self.out.write(&#39;</%s>&#39; % name)
    def startDirectory(self, attrs):
        self.directory.append(attrs[&#39;name&#39;])
        self.ensureDirectory()
    def endDirectory(self):
        print &#39;endDirectory&#39;
        self.directory.pop()
    def startPage(self, attrs):
        print &#39;startPage&#39;
        filename = os.path.join(*self.directory + [attrs[&#39;name&#39;]+&#39;.html&#39;])
        self.out = open(filename, &#39;w&#39;)
        self.writeHeader(attrs[&#39;title&#39;])
        self.passthrough = True
    def endPage(self):
        print &#39;endPage&#39;
        self.passthrough = False
        self.writeFooter()
        self.out.close()
    def writeHeader(self, title):
        self.out.write(&#39;<html>\n <head>\n  <title>&#39;)
        self.out.write(title)
        self.out.write(&#39;</title>\n </head>\n <body>\n&#39;)
    def writeFooter(self):
        self.out.write(&#39;\n </body>\n</html>\n&#39;)
parse(&#39;website.xml&#39;,WebsiteConstructor(&#39;public_html&#39;))

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

Tout d'abord, j'ai vu que ce programme avait 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 d'autre. En plus des éléments startElement, endElement et caractères que nous avons analysés, il y a aussi startPage, startDirectory, endDirectory; defaultEnd; ; et expédition, ces fonctions. À l'exception de la répartition, les fonctions précédentes sont faciles à comprendre. Chaque paire de fonctions traite simplement les balises HTML et les nœuds 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 de déterminer d'abord 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). existe, exécutez le nom de l'opération par défaut + : 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 de fonctions en python, comme getattr, les astérisques lors du passage des paramètres...

Connexe recommandé :

Projet de didacticiel de base Python 2 : bonnes images

Projet de didacticiel de base Python 4 : agrégation de nouvelles

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