1. '''
    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、命名空间


  1. 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中属性aakey)的值
    xx.set(key,value):设置当前节点的属性值,最后再write写入文件
    xx.keys():获取当前节点所有属性的keys,返回列表
    xx.items():获取当前节点的所有属性值,每对属性都是键值对
    xx.itertext():获取当前节点中子孙节点的所有内容,并返回一个迭代器,for
  1. '''
    1.检测qq是否在线
    from xml.etree import ElementTree as ET
    import requests
  1. 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
   在线

  1. ------------------------------------------------------------------
    2.列车时刻表
    #读取xml中的内容
  1. import requests
  1. 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',

  1. -----------------------------------------------------------------------------
    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

  1. ---------------------------------------------------------------------------
    ############ 解析方式二 ############
    #并修改其中的内容
    # 直接解析xml文件
    tree=ET.parse("first.xml")
    print (tree)
    # 获取xml文件的根节点
    root=tree.getroot()
    print(root)
  2.  
  3. 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']
  4.  
  5. tree.write("first.xml")
  1. ---------------------------------------------------------------------------

<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

  1. ---------------------------------------------------------------------------
    4.getroot中的方法
  1. '''
    ['__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))
  2.  
  3. '''
    5.创建xml文档
    '''
    5.1创建方式一:
  1. from xml.etree import ElementTree as ET
  2.  
  3. # 创建根节点
  4. root = ET.Element("famliy")
  5.  
  6. # 创建子节点
  7. son1 = ET.Element('son', {'name': 'a1'})
  8. # 创建小儿子
  9. son2 = ET.Element('son', {"name": 'a2'})
  10.  
  11. # 在子节点中创建子节点
  12. grandson1 = ET.Element('grandson', {'name': 'a11'})
  13. grandson2 = ET.Element('grandson', {'name': 'a12'})
    #将字节点中的子节点追加到子节点中
  14. son1.append(grandson1)
  15. son1.append(grandson2)
  16.  
  17. # 将子节点追加到根节点中
  18. root.append(son1)
  19. root.append(son1)
  20. #保存
  21. tree = ET.ElementTree(root)
  22. tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
    #enccoding=utf-8保存内容中有中文时
    short_empty_elements=False:不会自动加自闭(<vv a2="888"></vv>)
  1. xml_declaration=True:自动会在xml的顶部加上“<?xml version='1.0' encoding='utf-8'?>
  1. 5.2创建方式二
  1. from xml.etree import ElementTree as ET
  2.  
  3. # 创建根节点
  4. root = ET.Element("famliy")
  5.  
  6. # 创建子节点1
  7. # son1 = ET.Element('son', {'name': 'a1'})
  8. son1 = root.makeelement('son', {'name': 'a1'})
  9. # 创建子节点2
  10. # son2 = ET.Element('son', {"name": 'a2'})
  11. son2 = root.makeelement('son', {"name": 'a2'})
  12.  
  13. # 在子节点中创建子节点
  14. # grandson1 = ET.Element('grandson', {'name': 'a11'})
  15. grandson1 = son1.makeelement('grandson', {'name': 'a11'})
  16. # grandson2 = ET.Element('grandson', {'name': 'a12'})
  17. grandson2 = son1.makeelement('grandson', {'name': 'a12'})
  18. #将子节点中的子节点追加到子节点中
  19. son1.append(grandson1)
  20. son1.append(grandson2)
  21.  
  22. # 把子节点追加到根节点中
  23. root.append(son1)
  24. root.append(son1)
  25. #保存
  26. tree = ET.ElementTree(root)
  27. tree.write('oooo.xml',encoding='utf-8', short_empty_elements=False)
  1. 5.3创建方式三
  1. #创建根节点
    new_xml=ET.Element("namelist")
  2.  
  3. #创建根节点下的子节点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'
  4.  
  5. #创建子节点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'
  6.  
  7. 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)
  1. '''
    6.xml补充:
    '''
    6.1使用makeelement创建一个节点
      append()追加至某个节点
  1. from xml.etree import ElementTree as ET
  2.  
  3. #打开xml文件
    tree=ET.parse("first.xml")
    #获取根节点
    root=tree.getroot()
    print(root,root.tag,root.attrib,root.text)
  4.  
  5. #创建节点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.  
  7. '''
    6.2其他创建节点方式,ET.Element()
    '''
    ele1=ET.Element("p1",{'a3':'333'})
    ele2=ET.Element("p2",{'a4':'444'})
    son.append(ele1)
    ele1.append(ele2)
  8.  
  9. #tree.write("first.xml")
  10.  
  11. print("---------------------------------------------------------------------------------------")
  12.  
  13. '''
    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))
  14.  
  15. print("---------------------------------------------------------------------------------------")
  1. 7.两种修改xml文件方式
    A、字符串形式打开
  1. from xml.etree import ElementTree as ET
  2.  
  3. ############ 解析字符串方式打开 ############
  4.  
  5. # 打开文件,读取XML内容
    new_xml = open('first.xml', 'r').read()
  6.  
  7. # 将字符串解析成xml特殊对象,root代指xml文件的根节点
    root = ET.XML(new_xml)
  8.  
  9. ############ 操作 ############
  10.  
  11. # 顶层标签
    print(root.tag)
  12.  
  13. # 遍历data下的所有country节点
    for i in root.findall('country'):
    # 获取每一个i节点下rank节点的内容
    rank = int(i.find('rank').text)
  14.  
  15. if rank > 50:
    # 删除指定country节点
    root.remove(i)
  16.  
  17. ############ 保存文件 ############
    tree = ET.ElementTree(root)
    tree.write("newnew.xml", encoding='utf-8')
  1.   B、以解析文件打开
  1. from xml.etree import ElementTree as ET
  2.  
  3. ############ 解析文件方式 ############
  4.  
  5. # 直接解析xml文件
  6. tree = ET.parse("first.xml")
  7.  
  8. # 获取xml文件的根节点
  9. root = tree.getroot()
  10.  
  11. ############ 操作 ############
  12.  
  13. # 顶层标签
  14. print(root.tag)
  15.  
  16. # 遍历data下的所有country节点
  17. for i in root.findall('country'):
  18. # 获取每一个i节点下rank节点的内容
  19. rank = int(i.find('rank').text)
  20.  
  21. if rank > 50:
  22. # 删除指定country节点
  23. root.remove(i)
  24.  
  25. ############ 保存文件 ############
  26. tree.write("first.xml", encoding='utf-8')
  1. 8.保存xml右缩进
  1. '''
    from xml.dom import minidom:由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式:
    '''
  2.  
  3. from xml.etree import ElementTree as ET
    from xml.dom import minidom
  4.  
  5. def func(elem):
    '''
    将节点转化成字符串,并添加缩进
    :param elem:
    :return:
    '''
    rough_string=ET.tostring(elem,'utf-8')
    reparsed=minidom.parseString(rough_string)
    #返回缩进
    return reparsed.toprettyxml(indent="\t")
  6.  
  7. # 创建根节点
    root = ET.Element("famliy")
  8.  
  9. # 创建子节点
    son1 = ET.Element('son', {'name': 'a1'})
    # 创建小儿子
    son2 = ET.Element('son', {"name": 'a2'})
  10.  
  11. # 在子节点中创建子节点
    grandson1 = ET.Element('grandson', {'name': 'a11'})
    grandson2 = ET.Element('grandson', {'name': 'a12'})
    #将字节点中的子节点追加到子节点中
    son1.append(grandson1)
    son1.append(grandson2)
  12.  
  13. # 将子节点追加到根节点中
    root.append(son1)
    root.append(son1)
    #保存
    r=func(root)
    f=open('oooo.xml','w',encoding='utf-8')
    f.write(r)
    f.close()
  1.  

三十二、python操作XML文件的更多相关文章

  1. python操作xml文件

    一.什么是xml? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. abc.xml <?xml version="1.0&q ...

  2. 如何用python操作XML文件

    备注: 基于python3 背景:在统计覆盖率的时候希望绕属性name为test的节点 具体实现源码如下所示,基本都是基于节点属性操作的,当然也就可以基于tag等其他标签去做,可根据需要调整 from ...

  3. 三十二:WEB漏洞-文件操作之文件下载读取全解

    文件下载读取 原路,检测,利用,修复 利用 数据库配置文件下载或者读取后续 接口密钥信息文件下载或者读取后续 文件名,参数值,目录符号 read.xxx?filename= down.xxx?file ...

  4. geotrellis使用(三十二)大量GeoTiff文件实时进行TMS服务

    前言 在上一篇文章中我讲了如何直接将Geotiff文件发布为TMS服务,在其中只讲了单幅Geotiff的操作,其实单幅这种量级的数据对Geotrellis来说就是杀鸡焉用牛刀,Geotrellis针对 ...

  5. geotrellis使用(三十二)大量GeoTiff文件实时发布TMS服务

    前言 在上一篇文章中我讲了如何直接将Geotiff文件发布为TMS服务,在其中只讲了单幅Geotiff的操作,其实单幅这种量级的数据对Geotrellis来说就是杀鸡焉用牛刀,Geotrellis针对 ...

  6. 学以致用三十二-----python中函数的括号使用

    一直以来对python中函数括号的使用,有点分不清楚,到底什么时候用括号,什么时候不用括号,造成了很大看困惑. 今天来总结下. class aaa(): y = 'you' def __init__( ...

  7. 三十二 Python分布式爬虫打造搜索引擎Scrapy精讲—scrapy的暂停与重启

    scrapy的每一个爬虫,暂停时可以记录暂停状态以及爬取了哪些url,重启时可以从暂停状态开始爬取过的URL不在爬取 实现暂停与重启记录状态 1.首先cd进入到scrapy项目里 2.在scrapy项 ...

  8. 孤荷凌寒自学python第三十九天python 的线程锁Lock

    孤荷凌寒自学python第三十九天python的线程锁Lock (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 当多个线程同时操作一个文件等需要同时操作某一对象的情况发生时,很有可能发生冲突, ...

  9. (转载)Android项目实战(三十二):圆角对话框Dialog

    Android项目实战(三十二):圆角对话框Dialog   前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话 ...

随机推荐

  1. linux下的变量规则

    1.变量名可以由字母.数字和下划线组成,但是不能以数字开头: 2.变量在命名时,默认情况下为字符型: 3.为变量赋值时,等号两边不能有空格: 4.如果要增加变量的值,可以进行变量的叠加,不过需要将变量 ...

  2. 数学: HDU Co-prime

    Co-prime Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Subm ...

  3. 如何获取图片的base64编码

    1.准备一张图片,比如1.gif 2.使用chrome浏览器,新建立一个窗口,然后将a.png拖动至浏览器窗口里面,打开控制台(检查),最后点击source 3.使用方法: 注意source获取的一串 ...

  4. STM32 GPIO相关

    1. STM32 的 IO 作为输入的时候,可以程序设置上下拉电阻(可以不用外接上下拉电阻). 2.GPIO有四种输入模式:浮空输入.上拉输入.下拉输入.模拟输入: 3.GPIO有四种输出模式:开漏输 ...

  5. Tensorflow揭秘

    https://www.bilibili.com/video/av64970827/?p=7 tf2.0主要使用tf.keras api来构建模型,主要包括如下几个部分 一.Layers 如下是一些特 ...

  6. ocvate常用函数

    1.生成矩阵相关 https://www.coursera.org/learn/machine-learning/lecture/9fHfl/basic-operations 1. 初始化矩阵 a = ...

  7. Linux加载一个可执行程序并启动的过程

    原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 以shell下 ...

  8. man diff

    DIFF(1)                            GNU Tools                           DIFF(1) NAME/名称       diff - ...

  9. Linux校园网DNS问题

    问题 我发现在windows下连接校园网后能正常使用网络,可是到了Linux下,连接成功后还是不行 解决 在windows下找到ipv4的配置,然后查看一下那个DNS服务器的ip 在我们成都信息工程大 ...

  10. 【leetcode】410. Split Array Largest Sum

    题目如下: Given an array which consists of non-negative integers and an integer m, you can split the arr ...