`

项目一:万能的XML

 
阅读更多

最近感觉自己的工作中可能用到python,这语言实在是太强大了所以再次开始python的学习

通过联系小项目的形式练练手,下面是第一个项目,万能的XML

 

要使用python解析xml文件,我们需要用到SAX语法分分析器,这样我们就可以把xml解析的工作交给分析器取工作了。

本项目的主要工作:

  • 整个网站用一个XML文件描述,其中包括独立的网页和文件目录的描述
  • 程序能根据XML信息创建对应的html和目录文件
  • 能轻松地改变整个网站的设计,并以新的设计为基础重新生成新的网页和目录结构

 

自定一的xml文件如下:

<website>
	<page name="index" title="Home Page">
		<h1>Welcome to my Home Page</h1>

		<p>Hi. there. My name is Zeus. And this is my home page .Here are some of my interests:</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>Mr. Zeus's Shouting Page</h1>

			<p>...</p>
		</page>
		<page name="sleeping" title="sleeping">
			<h1>Mr. Hello's Sleeping Page</h1>

			<p>...</p>
		</page>
		<page name="eating" title="eating">
			<h1>Mr. World's Eating Page</h1>

			<p>...</p>
		</page>
	</directory>
</website>

 

对应的python解析xml代码如下:

#coding=utf-8
#!/usr/bin/python
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)
		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('</%s>' % name)
	
	def startDirectory(self, attrs):
		self.directory.append(attrs['name'])
		self.ensureDirectory()
	
	def endDirectory(self):
		self.directory.pop()
	
	def startPage(self, attrs):
		filename = os.path.join(*self.directory+[attrs['name']+'.html'])
		self.out = open(filename, 'w')
		self.writeHeader(attrs['title'])
		self.passthrough = True

	def endPage(self):
		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'))

 

分享到:
评论

相关推荐

    十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)

    练习项目三:万能的XML 练习项目四:新闻聚合 练习项目五:虚拟茶话会 clinet.py 来看代码: 练习项目六:使用CGI进行远程编辑 edit.cgi,用来接受index页面的名字,然后根据名字查找文件,...

    python基础教程项目三之万能的XML

    这个项目的名称与其叫做万能的XML不如叫做自动构建网站,根据一份XML文件,生成对应目录结构的网站,不过只有html还是太过于简单了,如果要是可以连带生成css那就比较强大了。这个有待后续研发,先来研究下怎么html...

    C# XML操作类库(加强版)

    最近做项目,要用C#写,而且数据格式是那种节点套节点能把人套死的XML,看着都觉得晕,而且节点跳跃性很大,真心觉得单纯用环境自带的XMLDocument类完全达不到自己的需要,因为XML里面涉及到节点循环,循环里面又套...

    Python基础教程(第2版.修订版)

    第22章 项目3:万能的XML 第23章 项目4:新闻聚合 第24章 项目5:虚拟茶话会 第25章 项目6:使用CGI进行远程编辑 第26章 项目7:自定义电子公告板 第27章 项目8:使用XML-RPC进行文件共享 第28章 项目9:文件...

    python基础教程 第三版 袁国忠译

    第 22 章 项目 3:万能的 XML..................340 第 23 章 项目 4:新闻汇总 .......................353 第 24 章 项目 5:虚拟茶话会...................364 第 25 章 项目 6:使用 CGI 进行远程编辑.............

    BulletinView:万能的公告栏轮播 View,也可用于商品个性垂直轮播展示

    BulletinView 别人的项目 :two-hump_camel: 万能的公告栏轮播 View,也可用于商品个性垂直轮播展示 预览图 Demo 下载体验 使用 下载 compile 'me.bakumon:bulletinview:1.0.0' 自定义属性 属性 描述 类型 ...

    Python基础教程(第3版)中文高清无水印+数据源代码

    20 章 项目 1:自动添加标签...............315第 21 章 项目 2:绘制图表 .......................332第 22 章 项目 3:万能的 XML..................340第 23 章 项目 4:新闻汇总 .......................353第 ...

    万能后台管理模板javaweb

    系统包含项目的源码和搭建的详细文档,以及数据库脚本 系统功能模块(开发时可取舍) 1. 权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限 角色(基础权限): 分角色组和角色,独立分配菜单权限和增...

    liee:激光诱导电子发射(BOINC 项目)

    主应用程序“app_opti_wrapp.cpp”是一个庞然大物的包装器,它按照万能的配置文件“liee_parameter.xml”的要求组装和执行各种模块。 中心模块是势能和求解器,而观察者可以收集模拟数据。 观察者应写入输出文件,...

    python入门到高级全栈工程师培训 第3期 附课件代码

    09 XML模块 10 re模块简介 11 re模块之元字符 第23章 01 re模块之转义字符 02 re模块之分组 03 re模块之方法 04 re模块总结 05 logging模块 06 re模块补充 07 configparse模块 08 hashlib模块 09 计算器作业以及...

    皮肤控件研究文档,破解后的库文件,皮肤设计工具使用教程

    界面库不是万能的,界面库的设计者需要考虑尽可能的避免让客户去绘制界面,但却无法做到100%避免,由于程序逻辑的需 要,客户有时候需要自己绘制控件的某一部分。因此一个完整的界面库系统需要有自绘的支持,即在...

    Android 屏幕横竖切换详解

    Android 里面控制Activity的方向,只要在AndroidManifest.xml里面对应的Activity节点下加一句 android:screenOrientation=”landscape”(landscape是横屏,portrait竖屏)。  我凭这句话混了一年,基本都可以的,...

    JSP简易用户管理系统2.0

    本项目仅实现了单表增删改查,和模糊查询与批删(仅供参考,后续仍会有更新版本) 1.由ServletFilter过滤器过滤所有请求,目的是修改编码格式 2.web.xml配置了所有请求 3.DeleteByIdServlet是单删的Servlet 4....

    Maven实战(高清版)

    xml2.7.3 不要使用ide内嵌的maven2.8 小结第3章 maven使用入门3.1 编写pom3.2 编写主代码3.3 编写测试代码3.4 打包和运行3.5 使用archetype生成项目骨架3.6 m2eclipse简单使用3.6.1 导入maven项目3.6.2 ...

    SharedLib:志在最便捷、最聪明的的app搭建方案

    小目标[1]项目框架搭建,暂时使用mvp模式,后期考虑到扩展将另外开分支扩展mvvm等。[2]网络框架封装,涉及到Volley、OkHttp、RxJava、NoHttp和Retrofit等封装使用。[3]图片加载,包含缓存处理及优化,考虑到的框架...

    PHP168建站系统

    文章栏目可以变成频道,一个频道可以生成一个独立的目录,可以是一级目录,也可以是二级,三级,四级目录.这样的话,就可以绑定一个二级域名. 19.不用设置服务器也能使用伪静态功能,增加谷歌的收录量,另外还可以设置成与...

    C#开发典型模块大全(光盘)第一部分

    4.2.1 如何制作一个接口程序 4.2.2 实现接口程序的信息互传 4.2.3 如何将接口程序加载到其他程序中 4.2.4 怎样操作RichtextBox控件的选择文本 4.2.5 如何获取数据表中字段的描述信息 4.3 设计过程 4.3.1 获取数据表...

    1345个易语言模块

    列表框项目拖动.ec 创建任意目录 1.0.0.2.ec 创建多级目录-西 风.ec 创建快捷方式1.0-西风.ec 创建快捷方式模块-简 1.0.ec 创建快捷方式模块2.2.ec 创建快捷方式 正.ec 创建数据库模块 1.0 .ec 创建数据库模块.ec ...

Global site tag (gtag.js) - Google Analytics