前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >三十二、python操作XML文件

三十二、python操作XML文件

作者头像
py3study
发布2020-01-08 17:46:39
9710
发布2020-01-08 17:46:39
举报
文章被收录于专栏:python3
代码语言:javascript
复制
'''
XML:模块

xml总结 1、解析 str 文件 tree,ElementTree,type root,Element,type 2、操作 Element: tag,text,find,iter,get,set... 3、重新写入 tree.write() str没有tree--->ElementTree(root) tree.write(xx,encoding='utf-8',xxx,xxx) 4、创建xml Element(xx,xx) 5、缩进 6、命名空间

代码语言:javascript
复制
xx.find(xxx):获取第一个寻找到的子节点
xx.findtext(xxx):获取到第一个找到的子节点的内容
xx.findall(aaa):获取所有的aaa节点
xx.tag:标签名
xx.text:子节点的内容
xx.attrib:子节点的属性
xx.makeelement(xxx):创建一个新的节点,仅为创建
ET.ElementTree(xxx.xml):生成文档对象
xx.append(son):为当前节点添加个子节点
xx.iter(aaa):获取指定节点,并为之创建一个迭代器for循环
xx.iterfind(aaa):获取指定节点,并为之创建一个迭代器for循环
xx.get(aa):获取当前节点xx中属性aa(key)的值
xx.set(key,value):设置当前节点的属性值,最后再write写入文件
xx.keys():获取当前节点所有属性的keys,返回列表
xx.items():获取当前节点的所有属性值,每对属性都是键值对
xx.itertext():获取当前节点中子孙节点的所有内容,并返回一个迭代器,for
代码语言:javascript
复制
'''
1.检测qq是否在线
from xml.etree import ElementTree as ET
import requests
代码语言:javascript
复制
response=requests.get('http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx/qqCheckOnline?qqCode=55465165')
response.encoding="utf-8"
result=response.text
print(result)
e=ET.XML(result)
print (e.text)
if e.text=="Y":
    print("在线")
else:
    print("离线")
------------------------------------------------------------------

   <?xml version="1.0" encoding="utf-8"?>    <string xmlns="http://WebXml.com.cn/">Y</string>    Y    在线

代码语言:javascript
复制
------------------------------------------------------------------
2.列车时刻表
#读取xml中的内容
代码语言:javascript
复制
import requests
代码语言:javascript
复制
from xml.etree import ElementTree as ET
response=requests.get('http://www.webxml.com.cn/WebServices/TrainTimeWebService.asmx/getDetailInfoByTrainCode?TrainCode=K234&UserID=')
response.encoding="utf-8"
result=response.text
print(result)
e=ET.XML(result)
print (e.text)
for i in e.iter("TrainDetailInfo"):
    print(i.find("TrainStation").text,i.find("ArriveTime").text,i.tag,i.attrib)
-----------------------------------------------------------------------------

   上海(车次:K234\K235) None TrainDetailInfo {'{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo1', '{urn:schemas-microsoft-com:xml-msdata}rowOrder': '0', '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}    昆山 11:44:00 TrainDetailInfo {'{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo2', '{urn:schemas-microsoft-com:xml-msdata}rowOrder': '1', '{urn:schemas-microsoft-com:xml-diffgram-v1}hasChanges': 'inserted'}    苏州 12:12:00 TrainDetailInfo {'{urn:schemas-microsoft-com:xml-diffgram-v1}id': 'TrainDetailInfo3', '{urn:schemas-microsoft-com:xml-msdata}rowOrder': '2', 

代码语言:javascript
复制
-----------------------------------------------------------------------------
3.
#打开本地的xml文件,并读取内容(只能读取,不能修改)
############ 解析方式一 ############
res_xml=ET.XML(open("first.xml","r",encoding="utf-8").read())
print(res_xml)
for i in res_xml.iter('country'):
    print (i.tag,i.attrib,i.find("rank").text,i.find("gdppc").text)
---------------------------------------------------------------------------

   <Element 'data' at 0x0000017EE58003B8>    country {'name': 'Liechtenstein'} 2 141100    country {'name': 'Singapore'} 5 59900    country {'name': 'Panama'} 69 13600

代码语言:javascript
复制
---------------------------------------------------------------------------
############ 解析方式二 ############
#并修改其中的内容
# 直接解析xml文件
tree=ET.parse("first.xml")
print (tree)
# 获取xml文件的根节点
root=tree.getroot()
print(root)

for i in root.iter("year"):
    print(i.tag,i.attrib,i.text)
    #让year的值自增1
    new_year=int(i.text)+1
    print(new_year)
    #自增1后赋值给i.text
    i.text=str(new_year)
    #更改或增加year的属性值
    i.set('name','nian')
    i.set('age', '18')
    #删除属性值
    del i.attrib['name']

tree.write("first.xml")
代码语言:javascript
复制
---------------------------------------------------------------------------

   <xml.etree.ElementTree.ElementTree object at 0x0000017EE6180668>    <Element 'data' at 0x0000017EE615F6D8>    year {'age': '18'} 2033    2034    year {'age': '18'} 2036    2037    year {'age': '18'} 2036    2037

代码语言:javascript
复制
---------------------------------------------------------------------------
4.getroot中的方法
代码语言:javascript
复制
'''
['__class__', '__copy__', '__deepcopy__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'attrib', 'clear', 'extend', 'find', 'findall', 'findtext', 'get', 'getchildren', 'getiterator', 'insert', 'items', 'iter', 'iterfind', 'itertext', 'keys', 'makeelement', 'remove', 'set', 'tag', 'tail', 'text']
tag
attrib
find
set
iter
set
get
'''
tree=ET.parse("first.xml")
root=tree.getroot()
print(dir(root))


'''
5.创建xml文档
'''
5.1创建方式一:

from xml.etree import ElementTree as ET # 创建根节点 root = ET.Element("famliy") # 创建子节点 son1 = ET.Element('son', {'name': 'a1'}) # 创建小儿子 son2 = ET.Element('son', {"name": 'a2'}) # 在子节点中创建子节点 grandson1 = ET.Element('grandson', {'name': 'a11'}) grandson2 = ET.Element('grandson', {'name': 'a12'}) #将字节点中的子节点追加到子节点中 son1.append(grandson1) son1.append(grandson2) # 将子节点追加到根节点中 root.append(son1) root.append(son1) #保存 tree = ET.ElementTree(root) tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False) #enccoding=utf-8保存内容中有中文时 short_empty_elements=False:不会自动加自闭(<vv a2="888"></vv>) xml_declaration=True:自动会在xml的顶部加上“<?xml version='1.0' encoding='utf-8'?>”

代码语言:javascript
复制
5.2创建方式二

from xml.etree import ElementTree as ET # 创建根节点 root = ET.Element("famliy") # 创建子节点1 # son1 = ET.Element('son', {'name': 'a1'}) son1 = root.makeelement('son', {'name': 'a1'}) # 创建子节点2 # son2 = ET.Element('son', {"name": 'a2'}) son2 = root.makeelement('son', {"name": 'a2'}) # 在子节点中创建子节点 # grandson1 = ET.Element('grandson', {'name': 'a11'}) grandson1 = son1.makeelement('grandson', {'name': 'a11'}) # grandson2 = ET.Element('grandson', {'name': 'a12'}) grandson2 = son1.makeelement('grandson', {'name': 'a12'}) #将子节点中的子节点追加到子节点中 son1.append(grandson1) son1.append(grandson2) # 把子节点追加到根节点中 root.append(son1) root.append(son1) #保存 tree = ET.ElementTree(root) tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)

代码语言:javascript
复制
5.3创建方式三

#创建根节点 new_xml=ET.Element("namelist") #创建根节点下的子节点1 name1=ET.SubElement(new_xml,"name",attrib={'a1':'aa1'}) #子节点下的子节点 age1=ET.SubElement(name1,"age",attrib={'a2':'aa2'}) sex1=ET.SubElement(name1,"sex") sex1.text='66' #创建子节点2 name2=ET.SubElement(new_xml,"name",attrib={'aa1':'aaa1'}) #创建子节点下的子节点 age2=ET.SubElement(name1,"age",attrib={'aa2':'aaa2'}) sex2=ET.SubElement(name1,"sex") sex2.text='88' new_year=ET.SubElement(name2,"year") new_year.text='2018' #保存 et = ET.ElementTree(new_xml) #生成文档对象 et.write("test.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)

代码语言:javascript
复制
'''
6.xml补充:
'''
6.1使用makeelement创建一个节点
  append()追加至某个节点
代码语言:javascript
复制
from xml.etree import ElementTree as ET

#打开xml文件
tree=ET.parse("first.xml")
#获取根节点
root=tree.getroot()
print(root,root.tag,root.attrib,root.text)

#创建节点makeelement,创建一个element对象
son=root.makeelement("kk",{'a1':'222'})
print(son)
son.text="666"
sub_son=son.makeelement("vv",{'a2':'888'})
#为当前节点追加一个子节点
root.append(son)
son.append(sub_son)
#写入文件
#tree.write("first.xml",short_empty_elements=False)
print("---------------------------------------------------------------------------------------")

'''
6.2其他创建节点方式,ET.Element()
'''
ele1=ET.Element("p1",{'a3':'333'})
ele2=ET.Element("p2",{'a4':'444'})
son.append(ele1)
ele1.append(ele2)

#tree.write("first.xml")

print("---------------------------------------------------------------------------------------")


'''
6.3 tree:
对象都是有类创建,对象所有的功能都与其相关的类中
1.ElementTree类创建,ElementTree(xxx)
2.getroot()获取xml的根节点
3.write()内存中xml写入文件中
'''
from xml.etree.ElementTree import ElementTree
from xml.etree.ElementTree import Element
tree=ET.parse("first.xml")
print(tree,type(tree))
root=tree.getroot()
print(root,type(root))

print("---------------------------------------------------------------------------------------")
代码语言:javascript
复制
7.两种修改xml文件方式
  A、字符串形式打开

from xml.etree import ElementTree as ET ############ 解析字符串方式打开 ############ # 打开文件,读取XML内容 new_xml = open('first.xml', 'r').read() # 将字符串解析成xml特殊对象,root代指xml文件的根节点 root = ET.XML(new_xml) ############ 操作 ############ # 顶层标签 print(root.tag) # 遍历data下的所有country节点 for i in root.findall('country'): # 获取每一个i节点下rank节点的内容 rank = int(i.find('rank').text) if rank > 50: # 删除指定country节点 root.remove(i) ############ 保存文件 ############ tree = ET.ElementTree(root) tree.write("newnew.xml", encoding='utf-8')

代码语言:javascript
复制
  B、以解析文件打开

from xml.etree import ElementTree as ET ############ 解析文件方式 ############ # 直接解析xml文件 tree = ET.parse("first.xml") # 获取xml文件的根节点 root = tree.getroot() ############ 操作 ############ # 顶层标签 print(root.tag) # 遍历data下的所有country节点 for i in root.findall('country'): # 获取每一个i节点下rank节点的内容 rank = int(i.find('rank').text) if rank > 50: # 删除指定country节点 root.remove(i) ############ 保存文件 ############ tree.write("first.xml", encoding='utf-8')

代码语言:javascript
复制
8.保存xml右缩进

''' from xml.dom import minidom:由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式: ''' from xml.etree import ElementTree as ET from xml.dom import minidom def func(elem): ''' 将节点转化成字符串,并添加缩进 :param elem: :return: ''' rough_string=ET.tostring(elem,'utf-8') reparsed=minidom.parseString(rough_string) #返回缩进 return reparsed.toprettyxml(indent="\t") # 创建根节点 root = ET.Element("famliy") # 创建子节点 son1 = ET.Element('son', {'name': 'a1'}) # 创建小儿子 son2 = ET.Element('son', {"name": 'a2'}) # 在子节点中创建子节点 grandson1 = ET.Element('grandson', {'name': 'a11'}) grandson2 = ET.Element('grandson', {'name': 'a12'}) #将字节点中的子节点追加到子节点中 son1.append(grandson1) son1.append(grandson2) # 将子节点追加到根节点中 root.append(son1) root.append(son1) #保存 r=func(root) f=open('oooo.xml','w',encoding='utf-8') f.write(r) f.close()

代码语言:javascript
复制
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档