使用XML快速建立网页-01
Posted 李嘉图杂文
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用XML快速建立网页-01相关的知识,希望对你有一定的参考价值。
使用XML快速建立网页-01
XML介绍:
XML可以表示任何信息:和html很像但是可以自定义标签
和html的区别在于xml侧重于数据的结构化,html侧重于浏览器显示
下面是xml常用功能的介绍还有学习的网站:
1.标记文本,以便进行普通的文档处理,比如XHTML,DocBook XML
2.表示音乐(musicxml.org)
3.表示任何对象(http://xml.coverpages.org/pml-ones.html)
4.通过网络调用Python方法
本项目要先设计使用的XML格式。
需要哪些标签?这些标签包含什么属性?各个标签都用来干嘛?
主要包括网站,目录,页面,名称,标题,内容
(1)网站(website) 是一个顶级元素,包含所有的文件和目录
(2)目录(directory) 主要作用是制作文件和其他目录的容器
(3)页面(page) 就是单个网页
(4)名称(directory和page的 name属性) 是目录名和文件名,会出现在文件系统和相应的URL中
(5)标题(page元素的title属性) 每个网页都必须有标题(不同于文件名)
(6)内容(page元素包含的XHTML代码) 这里我们用普通的XHTML表示内容,这样可以直接把内容放进最终的网页,并让浏览器解读
本项目使用SAX方法处理XML文档(也可以选择DOM方式),这种方法要求我们先编写一些事件处理程序,(类似GUI的编程)并让XML解析器读取XML文档时调用这些处理程序
(DOM方法是创建一个表示整个文档的数据结构(文档树)。这种方法需要内存很多,但是在需要操作文档的结构的时候非常有用)
原型程序(pagemaker.py)执行的任务:
(1)在每个page元素的开头,打开一个给定名称的新文件,并在其中写入合适的HTML首部(包括制定的title)
(2)在每个page元素的末尾,把合适的HTML尾部写入文件,再关闭文件
(3)在page文件内部,遍历所有的标签和字符并不修改它们(原样写入文件)
(4)在page文件外部,忽略所有的标签(website和directory)
(5)不能把标签原样写入HTML文件,因为parse只能解析出来名字,所以必须自己重建标签(加上<>,完善属性)
(6)SAX本身无法判断当前是否在page元素内,所以要像headlineHandler.py一样,加一个bool类型的flag,做判断
这是xml文件(website.xml)
<website>
<page name="index" title="Home Page">
<h1>Welcom to My Home Page</h1>
<p>Hi,there.My name is Mr.Ricardo, 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.Ricardo's Shouting Page</h1>
<p>...</p>
</page>
<page name="sleeping" title="Sleeping">
<h1>Mr.Ricardo's Sleeping Page</h1>
<p>...</p>
</page>
<page name="eating" title="Eating">
<h1>Mr.Ricardo's Eating Page</h1>
<p>...</p>
</page>
</directory>
</website>
首先写个小脚本检查自定义的xml文件有没有语法错误
from xml.sax.handler import ContentHandler
from xml.sax import parse
class TestHandler(ContentHandler):
def startElement(self,name,attrs):#这是重写sax方法的遇到开始标签事件的处理方法
print(name,attrs.keys())#名字和属性
parse('website.xml',TestHandler())
结果:
website []
page ['name', 'title']
h1 []
p []
ul []
li []
a ['href']
li []
a ['href']
li []
a ['href']
directory ['name']
page ['name', 'title']
h1 []
p []
page ['name', 'title']
h1 []
p []
page ['name', 'title']
h1 []
p []
>>>
说明我们的标签没有前后对应不上的情况
接下来使用一下SAX的检查元素开始,元素结束,还有读取文本的功能
from xml.sax.handler import ContentHandler
from xml.sax import parse
class HeadlineHandler(ContentHandler):
in_headline=False
def __init__(self,headlines):
super().__init__()
#super().__init__()的作用,就是执行父类的构造函数,使得我们能够调用父类的属性。
self.headlines=headlines
self.data=[]
def startElement(self,name,attrs):
if name=='h1':
self.in_headline=True
def endElement(self,name):
if name=='h1':
text=''.join(self.data)
self.data=[]
self.headlines.append(text)
self.in_headline=False
def characters(self,string):
if self.in_headline:
self.data.append(string)
headlines=[]
parse('website.xml',HeadlineHandler(headlines))
print('The following <h1> element were found:')
for h in headlines:
print(h)
结果:
The following <h1> element were found:
Welcom to My Home Page
Mr.Ricardo's Shouting Page
Mr.Ricardo's Sleeping Page
Mr.Ricardo's Eating Page
>>>
接下来写demo
from xml.sax.handler import ContentHandler
from xml.sax import parse
class PageMaker(ContentHandler):
passthrough=False
def __init__(self):
super().__init__()
def startElement(self,name,attrs):#开头标签
if name=='page':
self.passthrough=True
self.out=open(attrs['name']+'.html','w')#根据name属性生成html文件
self.out.write('<html><head>\n')
elif self.passthrough:
self.out.write('<'+name)
for key,val in attrs.items():
self.out.write('{}="{}"'.format(key,val))
self.out.write('>')
def endElement(self,name):#结尾标签
if name=='page':
self.passthrough=False
self.out.write('\n</body></html>\n')
self.out.close()
elif self.passthrough:
self.out.write('</{}>'.format(name))
def characters(self,chars):#标签中间的普通内容
if self.passthrough: self.out.write(chars)
parse('website.xml',PageMaker())
结果:
Welcom to My Home Page
Hi,there.My name is Mr.Ricardo, and this is my home page. Here are some of my interests:
Shouting
Sleeping
Eating
生成的HTML文件:
<html><head>
<h1>Welcom to My Home Page</h1>
<p>Hi,there.My name is Mr.Ricardo, and this is my home page. Here are some of my interests:</p>
<ul>
<li><ahref="interests/shouting.html">Shouting</a></li>
<li><ahref="interests/sleeping.html">Sleeping</a></li>
<li><ahref="interests/eating.html">Eating</a></li>
</ul>
</body></html>
以上是关于使用XML快速建立网页-01的主要内容,如果未能解决你的问题,请参考以下文章