python XML解析

本文介绍了XML的基本概念,如根节点、DTD约束以及三种解析XML的方式:DOM、SAX和ElementTree。DOM将整个XML加载到内存,SAX事件驱动、按需解析,ElementTree则提供快速轻量级的解析。通过示例展示了各解析方法的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

xml:
可扩展标记语言。标签形式展现,标签内名字可随意定义,属于HTML的一种,用于配置文件,可以用浏览器打开查看
根节点 只能有一个 开始和结束 子节点可带属性
    1.标签成对出现
    2.区分大小写
    3.标签要正确嵌套
    4.开始部分<?xml version="1.0" encoding="utf-8"?>
    5.只能有一个根节点
    6.节点可以有属性
DTD:
(Document(文档) Type(类型) Definition(文件))规定怎样去写 约束XML的节点
    <!DOCTYPE (根节点)[
        <!ELEMENT  根节点(子节点+)>——元素 +至少出现一次或多次
        <!ELEMENT 子节点(子节点属性1,2,3)>
        <!ELEMENT 子节点1(#PCDATA)>
        <!ELEMENT 子节点2(#PCDATA)>
        <!ELEMENT 子节点3(#PCDATA)>——纯文本
        <!ATTLISI 子节点  属性 CDATA #REQUIRED>——属性列表,哪个节点可以有属性,属性值是纯文本 #必须要有的
     ]>
   示例:
    <!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(属性值是固定的)
点右键validate可以查看有没有错误 
可以查DTD文档有具体的属性使用方法




解析:
三种方式解析
1.dom(文档对象模型) :把解析的xml整个加载到内存,组织成object树。
           w3cDom dom4j 
dom解析案例:
      要导入模块: parse解析
      form xml.dom.minidom import parse
      (先从根节点进行解析,然后子节点,子节点元素)
      自定义文档名=parse(“文件名.xml“  /如果同一个文件下)——得到整个XML文档
      自定义名称1=文档名.documentElement——得到根节点
      自定义列表名=自定义名称2.getElenmentsByTagName(“根节点名称”)——得到子节点属性,
      可以循环列表名得到多个子节点中属性的所有元素
      for i in 列表名称:
      名称1=i.getElementByTagName(“子节点元素名称”)[0].childNodes[0].data          ——得到节点内属性元素
                                                       #得到子节点第一个元素下  到子节点结束的中间的第一个元素
      名称2=i.getElementByTagName(“子节点元素名称”)[0].childNodes[0].data          ——得到节点内属性元素
                                                       #得到子节点第一个元素下  到子节点结束的中间的第一个元素
      属性=i.getAttribute("id")   ——得到ID属性值


示例:

 

from xml.dom.minidom import parse
#用类对象的形式获取 并添加到新的列表中
wenjian=parse('xml1.xml')
print(wenjian)
r=wenjian.documentElement
print(r)
s=r.getElementsByTagName("book")

class lei:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def __repr__(self):
         return self.name+"\t"+self.age+"\t"+self.sex+"\t"
list=[]
for i in s:
    a=i.getElementsByTagName("bname")[0]
    b=i.getElementsByTagName("price")[0]
    c=i.getElementsByTagName("author")[0]
    aa=a.childNodes[0].data
    bb=b.childNodes[0].data
    cc=c.childNodes[0].data
    lei1=lei(aa,bb,cc)
    list.append(lei1)
print(list)



查看:可以直接输出
存储:可以以集合字典的形式存储




2.sax:事件驱动式解析,只解析需要的,不会在内存中加载整个文档,只会根据自己编写的事件保存数据。
         sax 解析需要继承ContentHandler并重写其中的方法,ContentHandler类中常用方法如下
         导入模块:from xml.sax import ContentHandler, parse


方法 参数 作用 (5个固定方法默认自动执行)
1 startDocument(self )  # 文档启动时调用
2 startElement(self.name,attrs)name:元素名称,attrs:元素属性    #开始标签< 调用
3 charactersself(self,content)content :文本内容   #遇到行首、空格、字符时调用
4 endElement(self,name)元素名称   # 结束标签</ 时调用
5 endDocument(self )# 解析器到达文档结尾时调用


sax 模块常用方法:
make_parser() 创建一个新的解析器对象并返回
parse() 创建一个 SAX 解析器并解析xml文档
parseString() 创建一个XML解析器并解析xml字符串
 

示例:

from xml.sax import ContentHandler, parse

class lei:
    def __init__(self,name=0,age=0,sex=0):
        self.name=name
        self.age=age
        self.sex=sex

    def __repr__(self):
         return self.name+"\t"+self.age+"\t"+self.sex+"\t"+self.name1
list=[]
class sex(ContentHandler):
    lei1=lei()
    lei2=lei()
    def startDocument(self):  #开始方法
        print("解析开始 ")
                         #标签名 整个标签里的元素
    def startElement(self, name, attrs): #开始标签< 调用
        self.name=name
        if name=="book":
            self.lei1.name1=(attrs["id"])
                        #获取字符元素
    def characters(self, content): #遇到行首、空格、字符时调用
        if self.name=="bname":
            self.lei1.name=content
        elif self.name=="price" :
            self.lei1.age=content
        elif self.name=="author" :
            self.lei1.sex=content
        else:
            pass

    def endElement(self, name):#结束标签</ 时调用
        if name=="book":
            list.append(self.lei1)
        self.name=0
    def endDocument(self): #结束方法
        print("解析结束")

sex1=sex() #解析器实例对象
parse("xml1.xml",sex1)
#执行解析 要解析的文件,解析器实例对象
print(list)


 





3.elementTree解析:
ElementTree 在 Python 中有两种实现 :
1  纯 Python 实现:导入xml.etree.ElementTree 
2  C 语言实现:导入xml.etree.cElementTree 
    建议使用 C 语言 实现的 ElementTree,因为它速度更快,占用内存更少 
   (在程序中导入模块时如果C语言实现的不能使用,再使用纯Python实现的)
导入模块:import xml.etree.cElementTree as ce(重命名)

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


属性                                         作用
attrib                            获取节点的属性及属性值(以元祖的形式返回)
tag                               获取节点名称
text                              获取节点的文本值


示例:
 

import xml.etree.cElementTree as ce
a=ce.parse("xml1.xml")#导入根节点
b=a.findall("book")#得到子节点——列表
list=[]
class lei:
    def __init__(self,name=0,age=0,sex=0):
        self.name=name
        self.age=age
        self.sex=sex

    def __repr__(self):
         return self.name+"\t"+self.age+"\t"+self.sex+"\t"
for i in b:
    lei1=lei()
    b1=i.getchildren()#得到每一次项子节点——列表
    lei1.name=b1[0].text#得到列表元素
    lei1.age=b1[1].text
    lei1.sex=b1[2].text
    list.append(lei1)
print(list)




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值