使用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的主要内容,如果未能解决你的问题,请参考以下文章

使用vscode快速建立vue模板

VS中添加自定义代码片段——偷懒小技巧

黎活明8天快速掌握android视频教程--24_网络通信之网页源码查看器

JSP基础

XML快速写网页-02

c#代码片段快速构建代码