zoukankan      html  css  js  c++  java
  • 三十二、python操作XML文件

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


    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
    '''
    1.检测qq是否在线
    from xml.etree import ElementTree as ET
    import requests
    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
       在线

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

       上海(车次:K234K235) 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', 

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

    ---------------------------------------------------------------------------
    ############ 解析方式二 ############
    #并修改其中的内容
    # 直接解析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")
    ---------------------------------------------------------------------------

       <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

    ---------------------------------------------------------------------------
    4.getroot中的方法
    '''
    ['__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'?>
    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)
    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)
    '''
    6.xml补充:
    '''
    6.1使用makeelement创建一个节点
      append()追加至某个节点
    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("---------------------------------------------------------------------------------------")
    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')
      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')
    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=" ")

    # 创建根节点
    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()


  • 相关阅读:
    boost常用记录
    redis系列-redis的持久化
    分布式存储的一些概念
    搜索引擎学习-实现
    搜索引擎学习-概述
    设计模式-创建型模式(读书笔记)
    redis系列-redis的使用场景
    分布式系统设计准则
    2018/12/06 eclipse 快速加载需要的包
    2018/12/06 L1-028 判断素数 Java
  • 原文地址:https://www.cnblogs.com/chushujin/p/9431408.html
Copyright © 2011-2022 走看看