python(7.4)解析

XML解析方法详解
本文介绍了XML的基本结构及其三种主要解析方式:DOM、SAX及ElementTree。DOM将XML加载为对象树,SAX通过事件驱动的方式进行解析,而ElementTree则提供了一种简洁高效的解析方法。文中还详细展示了每种解析方法的具体实现。

一、 xml:

<?xml version="1.0" encoding="utf-8"?>
<students>
<student id="1">
  <stuname>张三</stuname>
 <stuage>20</stuage>
  <stusex>女</stusex>
</student>
<student id="2">
  <stuname>李四</stuname>
 <stuage>21</stuage>
  <stusex>男</stusex>
</student>
</students>
配置文件
 1.标签成对出现
 2.区分大小写
 3.标签要正确嵌套
 4.开始部分<?xml version="1.0" encoding="utf-8"?>
    5.只能有一个根节点
 6.节点可以有属性
DTD(Document Type Definition):约束XML文件的节点
<!DOCTYPE books [
    <!ELEMENT books (book+)>
    <!ELEMENT book (bname,price,author)>
    <!ELEMENT bname (#PCDATA)>
    <!ELEMENT price (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    <!ATTLIST book id CDATA #REQUIRED>
    ]>

#REQUIRED(必需的),#IMPLIED(不是必需的),#FIXED(属性值是固定的)

二、DOM解析

        把解析的xml整个加载到内存,组织成object树。

        from xml.dom.minidom import parse
    domTree=parse("persons.xml")
    print(domTree)
    #得到根节点
    root=domTree.documentElement;
    print(root)
    #得到需要的节点
    person=root.getElementsByTagName("person")
    print(person)
    for p in person: print(p.getElementsByTagName("name")[0].childNodes[0].data)
二、sax解析:
    sax 解析需要继承ContentHandler并重写其中的方法,ContentHandler类中常用方法如下


    方法 参数 作用
    startDocument() self 文档启动时调用
    endDocument() self 解析器到达文档结尾时调用
    startElement() self,name:元素名称,attrs:元素属性 遇到XML开始标签时调用
    endElement()self,name:元素名称 遇到XML结束标签时调用
    charactersself,content:文本内容 读取元素内容时调用
    ax 模块常用方法


方法 作用
make_parser() 创建一个新的解析器对象并返回
parse() 创建一个 SAX 解析器并解析xml文档
parseString() 创建一个XML解析器并解析xml字符串
from xml.sax import parse
from xml.sax import ContentHandler
class Person:
    def __init__(self,name=None,age=None,sex=None):
        self.name=name
        self.age=age
        self.sex=sex
    def __str__(self):
        return self.name+self.age+self.sex
persons=[]
class myh(ContentHandler):
    def __init__(self):
        self.person=None
        self.tag=None
 def startDocument(self):
        pass
 def startElement(self, name, attrs):
        self.tag=name
        if name=='person':
            self.person=Person()
        pass
 def endDocument(self):
        pass
 def endElement(self, name):
        if name=="person":
 persons.append(self.person)
            self.person=None
        self.tag=None
 def characters(self, content):
        if self.tag=="name":
            self.person.name=content
        if self.tag == "age":
            self.person.age = content
        if self.tag == "sex":
            self.person.sex = content


parse("persons.xml",myh())
for p in persons:

    print(p)

三、elementTree解析:

ElementTree 在 Python 中有两种实现 
一种是纯 Python 实现:xml.etree.ElementTree 
另一种是 C 语言实现:xml.etree.cElementTree 
建议使用 C 语言 实现的 ElementTree,因为它速度更快,占用内存更少 
在程序中导入模块时这样写(如果C语言实现的不能使用再使用纯Python实现的)


try:
 import xml.etree.cElementTree as ET
except ImportError:
 import xml.etree.ElementTree as ET
ElementTree 中 常用方法


方法                 作用
parse(xmlfile)     加载xml文件
fromstring(xmltext) 加载xml文件
findall()           获取指定的所有节点
find()             获取指定的节点
getchildren()     获取儿子节点
getiterator()     获取指定的所有节点,与findall()类似



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值