python XML解析

1,  XML的设计宗旨是传输数据,而非显示数据。

2,  不被定义,需要自定义标签。

3,  以文件形式存储数据,后缀xml。

4,  标准:标签成对出现;区分大小写;标签要正确嵌套;开始部分<?xml version=’1.0’ encoding=’utf-8’?>;只有一个根节点;节点里可以有属性。

5,  DTD可以约束xml节点

6,dom解析xml

from xml .dom.minidom import parse

class student:
    def __init__(self,name,xb,age,chengj):
        self.name=name
        self.xb=xb
        self.age=age
        self.chengj=chengj
    def __str__(self):
        return '姓名:{0} 性别:{1} 年龄:{2} 成绩:{3}'.format(self.name,self.xb,self.age,self.chengj)

#得到整个dom文档
doc=parse('scrath')
#得到根节点
root=doc.documentElement
print(root)
students=root.getElementsByTagName('student')
lst=[]
for p in students:
    people=student(p.getElementsByTagName('name')[0].childNodes[0].data,p.getElementsByTagName('xb')[0].childNodes[0].
                   data,p.getElementsByTagName('age')[0].childNodes[0].data,p.getElementsByTagName('chengj')[0].childNodes[0].data)
    lst.append(people)
    # print(p.getElementsByTagName('name')[0].childNodes[0].data)
    # print(p.getElementsByTagName('xb')[0].childNodes[0].data)
    # print(p.getElementsByTagName('age')[0].childNodes[0].data)
    # print(p.getElementsByTagName('chengj')[0].childNodes[0].data)
for i in lst:
    print(i)

7,sax解析xml

from xml.sax import ContentHandler
from xml.dom.minidom import parse
import parser
class Book:
    def __init__(self,bname=None,price=None,author=None):
        self.bname=bname
        self.price=price
        self.author=author
    def __str__(self):
        return '书名:{0}  价格:{1} 作者:{2}'.format(self.bname,self.price,self.author)
lst=[]
class mysaxxml(ContentHandler):
    def __init__(self,bok=None,tag=None):
        self.bok=bok
        self.tag=tag
    def startDocument(self):
        print('startDocument')
    def startElement(self, name, attrs):
        # 将一开始得到的元素节点名字赋值给tag
        self.tag=name
        # 开始时碰见标记book时创建对象并赋值给bok
        if name=='book':
            self.bok=Book()
        print('startElement')
    def characters(self, content):
        # tag获取到的标签分别判断,判断后再赋值
        if self.tag=='bname':
            self.bok.bname=content
        if self.tag=='price':
            self.bok.bname=content
        if self.tag=='author':
            self.bok.bname=content
        print('characters')
    def endElement(self, name):
        # 元素节点结束时如果遇到结尾的book,那么将这个对象添加到这个列表中,对象里面有3个属性值
        if name=='book':
            lst.append(self.bok)
            self.bok=None
        # 每判断一次属性就要将tag清空,比如先判断dname后,那么清空后它又能接着放price了
        self.tag=None
        print('endElement')
    def endDocument(self):
        print('endDocument')

bk=mysaxxml()
parse('book',bk)
for i in lst:
    print(i)
8,元素树解析xml
from xml.etree.ElementTree import *
class Book:
    def __init__(self,bname=None,price=None,author=None):
        self.bname=bname
        self.price=price
        self.author=author
    def __str__(self):
        return ('书名:{0} 价格:{1} 作者:{2}'.format(self.bname,self.price,self.author))
root=parse('book')
shu=root.findall('book')
lic=[]
for p in shu:
    mybook=Book()
    mybook.bname=p.find('bname').text
    mybook.price=p.find('price').text
    mybook.author=p.find('author').text
    lic.append(mybook)
for i in lic:
    print(i)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值