一、 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()类似