PythonとXMLを組み合わせる実践的なチュートリアル

php中世界最好的语言
リリース: 2018-04-09 14:34:54
オリジナル
1105 人が閲覧しました

今回は、Python と XML を組み合わせるための実践的なチュートリアルをお届けします。Python と XML を組み合わせる際の 注意事項 は何ですか?実際の事例を見てみましょう。

このプロジェクトの名前はユニバーサルXMLとは呼ばれず、XMLファイルを元に

ディレクトリ構造に対応したWebサイトを生成するという方が適切ですが、HTMLだけではあまりにも単純です。 CSSも生成できればもっと良いでしょう。これは今後開発する必要があります。まず HTML ウェブサイトの構造を勉強しましょう。 Web サイトは XML 構造を通じて生成されるため、すべてがこの XML ファイルから取得される必要があります。まず、この XML ファイル、website.xml を見てみましょう:


 
 

Welcome to my Home page

 

Hi, there. My name is Mr.gumby,and this is my home page,here are some of my int:

   
        

shouting page

   

....

  
      

sleeping page

   

...

  
       

Eating page

    

....

  
 
ログイン後にコピー
このファイルを使用して、このファイルを通じて Web サイトを生成する方法を見てみましょう。

まず、この XML ファイルを解析する必要があります。Python は Java と同じように XML を解析します。2 つの処理方法の違いは速度とスコープです。前者は効率を重視し、ドキュメントのみを処理します。後者は、最初にすべてのドキュメントをメモリにロードしてから処理するため、メモリを迅速かつ効率的に利用できます。唯一の利点は、処理が遅くなり、より多くのメモリを消費することです。ドキュメント全体を操作できるということです。

sax を使用して Python で XML を処理するには、まず xml.sax に parse 関数を導入し、xml.sax.handler に ContentHandler を導入する必要があります。後者のクラスは parse 関数と組み合わせて使用​​する必要があります。使用方法は次のとおりです: parse('xxx.xml',xxxHandler)、ここの xxxHandler は上記の ContentHandler を継承する必要がありますが、継承するだけで何もする必要はありません。 次に、parse 関数が XML ファイルを処理するときに、xxxHandler の startElement 関数と endElement 関数を呼び出して、xml 内のタグを開始および終了します。中間のプロセスでは、characters という名前の関数を使用して、タグ内のすべての文字列を処理します。

上記の理解により、xml ファイルを処理する方法がすでにわかりました。次に、悪の根源である website.xml ファイルを見て、その構造を分析します。ページとディレクトリの 2 つのノードしかないことは明らかです。 page はページを表します。

それで、この XML ファイルを処理するアイデアが明確になります。 XML ファイルの各ノードを読み取り、それがページであるかディレクトリであるかを判断し、ページである場合は HTML ページを作成し、ノードの内容をファイルに書き込みます。ディレクトリが見つかった場合は、フォルダーを作成し、その中にあるページ ノード (存在する場合) を処理します。

コードのこの部分を見てみましょう。この本の実装はより複雑で柔軟です。まずはそれを見てから分析しましょう。

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('<' + name)
            for key, val in attrs.items():
                self.out.write(' %s="%s"' %(key, val))
            self.out.write('>')
    def defaultEnd(self, name):
        if self.passthrough:
            self.out.write('' % 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('\n \n  ')
        self.out.write(title)
        self.out.write('\n 
\n \n')     def writeFooter(self):         self.out.write('\n \n\n') parse('website.xml',WebsiteConstructor('public_html'))
ログイン後にコピー
このプログラムの分析はもう少し複雑なようですが、偉人猫猫は、どんな複雑なプログラムも張り子の虎だと言いました。それでは、このプログラムをもう一度分析してみましょう。

まず、このプログラムには 2 つのクラスがあることがわかりますが、実際には継承により 1 つのクラスと見なすことができます。

次に、分析した startElement、endElement、文字に加えて、startPage、endDirectory、writeHeader、writeFooter、dispatch などの追加の関数があることを見てみましょう。ディスパッチを除いて、前述の関数の各ペアは、対応する

html タグ と XML ノードを単純に処理します。ディスパッチの複雑さは、関数を動的に組み合わせて実行するために使用されることです。

dispatchの処理の考え方は、まず渡されたパラメータ(つまりオペレーション名とノード名)を元にstartPageなどの対応する関数があるかどうかを判断し、存在しない場合はdefault+オペレーション名を実行します。 :defaultStart など。

各機能を一つ一つ理解すると、全体の処理の流れが分かります。まず、Web サイト全体を保存する public_html ファイルを作成し、次に XML ノードを読み取り、startElement と endElement を通じてディスパッチを呼び出して処理します。次に、dispatch が特定の処理関数を呼び出す方法について説明します。 この時点で、このプロジェクトの分析は完了しました。

マスターする主な内容は、Python で XML を処理するための SAX の使用であり、もう 1 つは、パラメーターを渡す際の getattr やアスタリスクなどの Python の関数の使用です...

以降の方法はマスターできたと思います。この記事の事例などを読んでみてください。とても興味深いですね。php 中国語 Web サイトの他の関連記事にも注目してください。

推奨書籍:

Python でデータ フレーム内のデータをデータベースに書き込む方法

Python レプリケーションでオブジェクトのライフ サイクルを使用する方法

以上がPythonとXMLを組み合わせる実践的なチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!