python 对 xml 文件的处理

#usr/bin/python
#-*-coding:utf-8-*-


"""
python 对 xml 文件的处理
    方式一:dom
            将文件在内存中解析成一个树来操作
            优点:可以任意遍历树的节点
            缺点:占用内存大,解析速度慢
    方式二:xml.etree.ElementTree
            类似一个轻量级的dom
    方式三:xml.sax

"""

import xml.etree.ElementTree as ET


tree = ET.parse("01.xml")  #  ET.parse("文件路径") 加载想要读取的文件 ,赋予 tree

root = tree.getroot() # tree.getroot()  获取根节点

"""
    获取根节点然后赋予 root
            此时 root 具有三个属性:
                1,root.tag     是节点的标签名
                2,root.attrib  是节点的属性 格式为,属性=“属性值”,可以有多个属性,以空格分隔
                3,root.text    是节点的文本内容

"""

print('root_tag:{}'.format(root.tag))    # .tag 节点标签名称
print("root_attrib:{}".format(root.attrib)) # .attrib  节点标签的属性,输出为字典
print("root_text:{}".format(root.text))   # .text 节点标签的内容

node1 = root.find("country")  # find()父级查找直接子级节点 ,只能获取子级的第一个 country 节点
print(node1.tag,node1.attrib,node1.text)


node11 = node1.find("rank")
print(node11.tag,node11.attrib,node11.text)

node2 = root.findall("country")  # findall()  父级查找直接子级的所有 country 节点,输出为列表
print(node2)

for i in node2:
    print("tag:{} | attrib:{} | text:{}".format(i.tag,i.attrib,i.text))

for sub_root in root:
    print("sub_root_tag:{},sub_root_attrib:{},sub_root_text:{}".format(sub_root.tag,sub_root.attrib,sub_root.text))


for node in node2:
    if node.attrib["name"] == "日本":  # 找到属性名为日本的节点
        root.remove(node)    # 调用该节点的父节点来删除
        break
tree.write("02.xml",encoding="utf-8")  # 执行完毕写入到文件 02.xml


""" 
字典格式输出
        1,以一级节点属性名 name 的值为 key ,以二级节点为 value
        2,value 为列表格式
        3,value 列表中,嵌套字典,该字典以二级节点标签名为 key ,以二级节点 text 为 value
            
"""
dict1 = {}
value = []
for i in root:  # 遍历根节点的子节点 (获取一级节点)
    # print("tag:{},attrib:{},text:{}".format(i.tag,i.attrib,i.text))
    for j in i:  # 遍历一级节点的子节点(获取二级节点)
        # print("\t\ttag:{},attrib:{},text:{}".format(j.tag,j.attrib,j.text)) # text 没有的输出 None
        # print()
        # for k in j:   # 三级
        #     print("\t\t\t\ttag:{},attrib:{},text:{}".format(k.tag,k.attrib,k.text))
        if j.text is None:
            value.append(j.attrib)
        else:
            value.append({j.tag:j.text})
    dict1[i.attrib["name"]] = value

print(dict1)




"""
python 对 xml 文件的处理
    方式一:dom
            将文件在内存中解析成一个树来操作
            优点:可以任意遍历树的节点
            缺点:占用内存大,解析速度慢
    方式二:xml.etree.ElementTree
            类似一个轻量级的dom
    方式三:xml.sax

"""

import xml.sax

class MovieHandler(xml.sax.ContentHandler): # 定义类,并继承 xml.sax.ContenHandler
    def __init__(self):
        self.CurrentData = ""  # 当前数据
        self.type = ""
        self.format = ""
        self.year = ""
        self.rating = ""
        self.stars = ""
        self.description = ""

    def startElement(self, tag, attrs):
        self.CurrentData = tag
        if tag == "movie":
            print("-----------------------movie--------------------")
            title = attrs["title"]
            print("title:{}".format(title))

    def characters(self, content):
        if self.CurrentData == "type":
            self.type = content
        elif self.CurrentData == "format":
            self.format = content
        elif self.CurrentData == "year":
            self.year = content
        elif self.CurrentData == "rating":
            self.rating = content
        elif self.CurrentData == "stars":
            self.stars = content
        elif self.CurrentData == "description":
            self.description = content

    def endElement(self, name):
        if self.CurrentData == "type":
            print("type:{}".format(self.type))
        elif self.CurrentData == "format":
            print("format:{}".format(self.format))
        elif self.CurrentData == "year":
            print('year:{}'.format(self.year))
        elif self.CurrentData == "rating":
            print('rating:{}'.format(self.rating))
        elif self.CurrentData == "stars":
            print('stars:{}'.format(self.stars))
        elif self.CurrentData == "description":
            print("description:{}".format(self.description))

        self.CurrentData = ""


if __name__ == "__main__":

    p1 = xml.sax.make_parser() # 创建  sax 阅读器  p1

    h1 = MovieHandler()  #  实例化 MovierHandler  为h1

    p1.setContentHandler(h1) # 阅读器 p1 调用 setContentHandler() 执行 h1

    p1.parse("001.xml")  # p1 调用parse()  读取 001.xml

你可能感兴趣的:(python 对 xml 文件的处理)