最近感觉自己的工作中可能用到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'))
相关推荐
练习项目三:万能的XML 练习项目四:新闻聚合 练习项目五:虚拟茶话会 clinet.py 来看代码: 练习项目六:使用CGI进行远程编辑 edit.cgi,用来接受index页面的名字,然后根据名字查找文件,...
这个项目的名称与其叫做万能的XML不如叫做自动构建网站,根据一份XML文件,生成对应目录结构的网站,不过只有html还是太过于简单了,如果要是可以连带生成css那就比较强大了。这个有待后续研发,先来研究下怎么html...
最近做项目,要用C#写,而且数据格式是那种节点套节点能把人套死的XML,看着都觉得晕,而且节点跳跃性很大,真心觉得单纯用环境自带的XMLDocument类完全达不到自己的需要,因为XML里面涉及到节点循环,循环里面又套...
第22章 项目3:万能的XML 第23章 项目4:新闻聚合 第24章 项目5:虚拟茶话会 第25章 项目6:使用CGI进行远程编辑 第26章 项目7:自定义电子公告板 第27章 项目8:使用XML-RPC进行文件共享 第28章 项目9:文件...
第 22 章 项目 3:万能的 XML..................340 第 23 章 项目 4:新闻汇总 .......................353 第 24 章 项目 5:虚拟茶话会...................364 第 25 章 项目 6:使用 CGI 进行远程编辑.............
BulletinView 别人的项目 :two-hump_camel: 万能的公告栏轮播 View,也可用于商品个性垂直轮播展示 预览图 Demo 下载体验 使用 下载 compile 'me.bakumon:bulletinview:1.0.0' 自定义属性 属性 描述 类型 ...
20 章 项目 1:自动添加标签...............315第 21 章 项目 2:绘制图表 .......................332第 22 章 项目 3:万能的 XML..................340第 23 章 项目 4:新闻汇总 .......................353第 ...
系统包含项目的源码和搭建的详细文档,以及数据库脚本 系统功能模块(开发时可取舍) 1. 权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限 角色(基础权限): 分角色组和角色,独立分配菜单权限和增...
主应用程序“app_opti_wrapp.cpp”是一个庞然大物的包装器,它按照万能的配置文件“liee_parameter.xml”的要求组装和执行各种模块。 中心模块是势能和求解器,而观察者可以收集模拟数据。 观察者应写入输出文件,...
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 里面控制Activity的方向,只要在AndroidManifest.xml里面对应的Activity节点下加一句 android:screenOrientation=”landscape”(landscape是横屏,portrait竖屏)。 我凭这句话混了一年,基本都可以的,...
本项目仅实现了单表增删改查,和模糊查询与批删(仅供参考,后续仍会有更新版本) 1.由ServletFilter过滤器过滤所有请求,目的是修改编码格式 2.web.xml配置了所有请求 3.DeleteByIdServlet是单删的Servlet 4....
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 ...
小目标[1]项目框架搭建,暂时使用mvp模式,后期考虑到扩展将另外开分支扩展mvvm等。[2]网络框架封装,涉及到Volley、OkHttp、RxJava、NoHttp和Retrofit等封装使用。[3]图片加载,包含缓存处理及优化,考虑到的框架...
文章栏目可以变成频道,一个频道可以生成一个独立的目录,可以是一级目录,也可以是二级,三级,四级目录.这样的话,就可以绑定一个二级域名. 19.不用设置服务器也能使用伪静态功能,增加谷歌的收录量,另外还可以设置成与...
4.2.1 如何制作一个接口程序 4.2.2 实现接口程序的信息互传 4.2.3 如何将接口程序加载到其他程序中 4.2.4 怎样操作RichtextBox控件的选择文本 4.2.5 如何获取数据表中字段的描述信息 4.3 设计过程 4.3.1 获取数据表...
列表框项目拖动.ec 创建任意目录 1.0.0.2.ec 创建多级目录-西 风.ec 创建快捷方式1.0-西风.ec 创建快捷方式模块-简 1.0.ec 创建快捷方式模块2.2.ec 创建快捷方式 正.ec 创建数据库模块 1.0 .ec 创建数据库模块.ec ...