Python XML解析

1.什么是XML?

        a) XML 指可扩展标记语言(eXtensibleMarkupLanguage)。

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

2.XML语法

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

<?xml version="1.0" encoding="utf-8" ?>
<students>
    <student>
        <name>石旭辉</name>
        <sex>男</sex>
        <age>13</age>
        <height>2.33</height>
        <score>128</score>
    </student>

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

      c)XML 必须正确嵌套

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

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

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


3.python对XML的解析

         python有三种方法解析XML,分别是 DOMSAX,以及ElementTree

4.ContentHandler类方法的介绍

characters(content)方法

调用时机:

从行开始,遇到标签之前,存在字符,content的值为这些字符串; 从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串; 从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串; 标签可以是开始标签,也可以是结束标签。

startDocument()方法:文档启动的时候调用。

endDocument()方法:解析器到达文档结尾时调用。

startElement(name, attrs)方法:遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。

endElement(name)方法:遇到XML结束标签时调用。

5.访问和操作XML的方法

   (1)获取元素

x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
txt=x.nodeValue

      ( 2 )获取属性的值

txt=xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");

    (3)删除元素

            removeChild() 方法删除指定的节点(或元素)。

x=xmlDoc.getElementsByTagName("book")[0];

x.removeChild(x.childNodes[0]);



下面我们做个练习

        关于学生的信息情况:分别用三种解析方式去解析

(1)第一种是DOM解析

from xml.dom.minidom import parse               #第一步必须要先导入模块
class Student:                                  #第二步去定义一个类
    def __init__(self,name,sex,age):
        self.name = name
        self.sex = sex
        self.age = age
    def __str__(self):
        return "姓名:{0}  性别:{1}  年龄:{2}".format(self.name,self.sex,self.age)

student1 = []                           #定义一个空列表     
doc = parse("学生对象信息.xml")
root = doc.documentElement              #从文档中获取根节点
#print(root)
students = root.getElementsByTagName("student")
#print(students)
for p in students:
    student = Student(p.getElementsByTagName("name")[0].childNodes[0].data,p.getElementsByTagName("sex")[0].childNodes[0].data,p.getElementsByTagName("age")[0].childNodes[0].data)
    student1.append(student)
for p in student1:
    print(p)

(2)第二种是SAX解析

from xml.sax import ContentHandler
from xml.dom.minidom import parse

class Student:
    def __init__(self,name =None,sex = None,age = None):
        self.name = name
        self.sex = sex
        self.age = age
    def __str__(self):
        return "姓名:{0}  性别:{1}  年龄:{2}".format(self.name,self.sex,self.age)

student1 = []
class mysaxxml(ContentHandler):
    def __init__(self):
        self.tag=None                               #为什么要这么写???
        self.stu=None
    def startDocument(self):
        print("startdocument...")
    def startElement(self, name, attrs):
        self.tag = name
        if name =="student":
            self.stu = Student()
    def characters(self, content):
        if self.tag =="name":
            self.stu.name=content
        if self.tag =="sex":
            self.stu.sex=content
        if self.tag =="age":
            self.stu.age=content
    def endElement(self, name):
        if name == "student":
            student1.append(self.stu)
            self.stu = None
        self.tag = None                             #此处为何这么放置 self.tag = None  ??
    def endDocument(self):
        print("endDocument.......")
sts = mysaxxml()
parse("学生对象信息.xml",sts)
for p in student1:
    print(p)
(3)第三种 ElementTree 元素树解析
from xml.etree.ElementTree import *

class Student:
    def __init__(self,name = None,sex = None,age = None):
        self.name = name
        self.sex = sex
        self.age = age
    def __str__(self):
        return "姓名:{0}  性别:{1}  年龄:{2}".format(self.name,self.sex,self.age)

people = []
root = parse("学生对象信息.xml")
student1 = root.findall("student")

for p in student1:
    student = Student()
    student.name = p.find("name").text
    student.sex = p.find("sex").text
    student.age = p.find("age").text
    people.append(student)
for p in people:
    print(p)





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值