您的位置:首页 > 编程语言 > Python开发

《python基础教程》项目3

2016-07-29 16:52 295 查看
项目3 :万能的XML

情况是:自动构建网站,根据一份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">Shouting</a></li>
<li><a href="interests/sleeping.html">Sleeping</a></li>
<li><a href="interests/eating.html">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>


下面是代码:

#-*- coding:utf8 -*-

"""
最终版本(编写多一个混入类,和contenthandlers一起继承)
"""
import os
from xml.sax import ContentHandler
from xml.sax import parse

class Dispatcher:
'混入类'
#dispatch的处理思路:首先根据传递的参数(就是操作名称以及节点名称)判断是否存在对应的函数如startPage,
#                   如果不存在则执行default+操作名称:如defaultStart。
def dispatch(self, pre, name, attrs=None):
aname = pre + name.capitalize()
bname = 'default' + pre.capitalize()
method = getattr(self, aname, None)

if callable(method):
args = ()
else:
method = getattr(self, bname, None)
args = name,
print method
if pre == 'start': args += attrs,   #如果是起始处理程序,就将属性添加到args
if callable(method): method(*args)

def startElement(self, name, attrs):
self.dispatch('start', name, attrs)
def endElement(self, name):
self.dispatch('end', name)

class Test(Dispatcher, ContentHandler):
'事件处理程序:2个处理目录,2个处理页面'
passconfirm = False

def __init__(self, directory):
self.directory = [directory]  #列表
self.judgeDirectory()
def judgeDirectory(self):
path = os.path.join(*self.directory)
if not os.path.isdir(path):
os.makedirs(path)

def startDirectory(self,attrs):
self.directory.append(attrs['name'])
self.judgeDirectory()
def endDirectory(self):
self.directory.pop()

def Header(self,title):
self.out.write('<html>\n<head>\n<title>')
self.out.write(title)
self.out.write('</title>\n</head>\n<body>\n')
def Footer(self):
self.out.write('\n</body></html>\n')

def startPage(self, attrs):
filename = os.path.join(*self.directory+[attrs['name']+'.html'])
self.out = open(filename, 'w')
self.Header(attrs['title'])
self.passconfirm = True
def endPage(self):
self.passconfirm = False
self.Footer()
self.out.close()

def defaultStart(self, name, attrs):
if self.passconfirm:
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.passconfirm:
self.out.write('</%s>' % name)
def characters(self, content):
if self.passconfirm:
self.out.write(content)

parse('website.xml', Test('A'))  #parse函数:解析xml文件:负责读取文件并生成事件


执行完生成四个html文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: