解析器

什么是XML?

XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习

XML 被设计用来传输和存储数据。

XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。

它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。

XML语法

       a)  XML 必须包含根元素,它是所有其他元素的父元素,就像下面这个中 students 就是根元素:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <students>  
  3.     <student>  
  4.         <name>李明</name>  
  5.         <sex></sex>  
  6.         <age>18</age>  
  7.         <height>1.6</height>  
  8.         <score>178</score>  
  9.     </student>  

       b)所有的 XML 元素都必须有一个关闭标签!

      c)XML 必须正确嵌套

      d)开始部分:  <?xml version=1.0encoding=utf-8>

    e)标签成对出现,并且区分大小写

    f)可以有属性,只能有一个根节点!!!

python对XML的解析

常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。

python有三种方法解析XML,SAX,DOM,以及ElementTree:

1.SAX (simple API for XML )

python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

2.DOM(Document Object Model)

将XML数据在内存中解析成一个树,通过对树的操作来操作XML。

python使用SAX解析xml

SAX是一种基于事件驱动的API。

利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。

解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;

而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。

<psax适于处理下面的问题:< p="" style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', Arial, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);">
  • 1、对大型文件进行处理;
  • 2、只需要文件的部分内容,或者只需从文件中得到特定信息。
  • 3、想建立自己的对象模型的时候。

在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。

使用xml.dom解析xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。


[python]  view plain  copy
  1. 1)第一种是DOM解析  
  2.   
  3. [python] view plain copy  
  4. from xml.dom.minidom import parse               #第一步必须要先导入模块    
  5. class Student:                                  #第二步去定义一个类    
  6.     def __init__(self,name,sex,age):    
  7.         self.name = name    
  8.         self.sex = sex    
  9.         self.age = age    
  10.     def __str__(self):    
  11.         return "姓名:{0}  性别:{1}  年龄:{2}".format(self.name,self.sex,self.age)    
  12.     
  13. student1 = []                           #定义一个空列表         
  14. doc = parse("学生对象信息.xml")    
  15. root = doc.documentElement              #从文档中获取根节点    
  16. #print(root)    
  17. students = root.getElementsByTagName("student")    
  18. #print(students)    
  19. for p in students:    
  20.     student = Student(p.getElementsByTagName("name")[0].childNodes[0].data,p.getElementsByTagName("sex")[0].childNodes[0].data,p.getElementsByTagName("age")[0].childNodes[0].data)    
  21.     student1.append(student)    
  22. for p in student1:    
  23.     print(p)    
  24. 2)第二种是SAX解析  
  25.   
  26. [python] view plain copy  
  27. from xml.sax import ContentHandler    
  28. from xml.dom.minidom import parse    
  29.     
  30. class Student:    
  31.     def __init__(self,name =None,sex = None,age = None):    
  32.         self.name = name    
  33.         self.sex = sex    
  34.         self.age = age    
  35.     def __str__(self):    
  36.         return "姓名:{0}  性别:{1}  年龄:{2}".format(self.name,self.sex,self.age)    
  37.     
  38. student1 = []    
  39. class mysaxxml(ContentHandler):    
  40.     def __init__(self):    
  41.         self.tag=None                               #为什么要这么写???    
  42.         self.stu=None    
  43.     def startDocument(self):    
  44.         print("startdocument...")    
  45.     def startElement(self, name, attrs):    
  46.         self.tag = name    
  47.         if name =="student":    
  48.             self.stu = Student()    
  49.     def characters(self, content):    
  50.         if self.tag =="name":    
  51.             self.stu.name=content    
  52.         if self.tag =="sex":    
  53.             self.stu.sex=content    
  54.         if self.tag =="age":    
  55.             self.stu.age=content    
  56.     def endElement(self, name):    
  57.         if name == "student":    
  58.             student1.append(self.stu)    
  59.             self.stu = None    
  60.         self.tag = None                             #此处为何这么放置 self.tag = None  ??    
  61.     def endDocument(self):    
  62.         print("endDocument.......")    
  63. sts = mysaxxml()    
  64. parse("学生对象信息.xml",sts)    
  65. for p in student1:    
  66.     print(p)    
  67. 3)第三种 ElementTree 元素树解析  
  68. [python] view plain copy  
  69. from xml.etree.ElementTree import *    
  70.     
  71. class Student:    
  72.     def __init__(self,name = None,sex = None,age = None):    
  73.         self.name = name    
  74.         self.sex = sex    
  75.         self.age = age    
  76.     def __str__(self):    
  77.         return "姓名:{0}  性别:{1}  年龄:{2}".format(self.name,self.sex,self.age)    
  78.     
  79. people = []    
  80. root = parse("学生对象信息.xml")    
  81. student1 = root.findall("student")    
  82.     
  83. for p in student1:    
  84.     student = Student()    
  85.     student.name = p.find("name").text    
  86.     student.sex = p.find("sex").text    
  87.     student.age = p.find("age").text    
  88.     people.append(student)    
  89. for p in people:    
  90.     print(p)    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值