zoukankan      html  css  js  c++  java
  • 小白的Python之路 day5 模块XML特点和用法

    模块XML的特点和用法

    一、简介

      xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。

    二、特点

    xml的格式如下,就是通过<>节点来区别数据结构的:

     1 <duoduo>#这里面的内容可以换
     2     <country name="Liechtenstein">
     3         <rank updated="yes">2</rank>
     4         <year>2008</year>
     5         <gdppc>141100</gdppc>
     6         <neighbor name="Austria" direction="E"/>
     7         <neighbor name="Switzerland" direction="W"/>  
     8     </country> #观察可以发现实际上和字典的特性差不多
     9     <country name="Singapore">
    10         <rank updated="yes">5</rank>
    11         <year>2011</year>
    12         <gdppc>59900</gdppc>
    13         <neighbor name="Malaysia" direction="N"/>
    14     </country>
    15     <country name="Panama">
    16         <rank updated="yes">69</rank>
    17         <year>2011</year>
    18         <gdppc>13600</gdppc>
    19         <neighbor name="Costa Rica" direction="W"/>
    20         <neighbor name="Colombia" direction="E"/>
    21     </country>
    22 </duoduo>

    三、XML的用法

    xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml 

    1、查询xml文档内容

     1 import xml.etree.ElementTree as ET
     2 
     3 tree = ET.parse("xmltest.xml")
     4 root = tree.getroot()
     5 print(root)    #获取根节点,也就是内存地址
     6 print(root.tag)  #根的名字
     7 
     8 # 遍历xml文档
     9 for country in root:
    10     print(country.tag, country.attrib)  #分别打印子节点名称和子节点属性
    11     for i in country:   #遍历子节点下的所有节点
    12         print(i.tag, i.text,i.attrib)  #打印子节点下节点的节点名,节点值,节点值的属性
    13     # 只遍历year节点
    14     for i in country.iter("year"):
    15         print("	", i.tag, i.attrib, i.text)
    16 
    17 # 只遍历year 节点
    18 for node in root.iter('year'):
    19     print(node.tag, node.text)  #打印year的节点名和节点值

    重点:

      1、tag是返回节点名,attrib返回节点属性,text返回节点值

      2、返回根节点用getroot()方法

      3、只遍历某个节点,只需要用iter(节点名)方法

      4、遍历找不到要找的只能继续往下遍历

    2、修改xml文档内容

     1 import xml.etree.ElementTree as et
     2  
     3 tree = et.parse("xmltest.xml")
     4 root = tree.getroot()
     5  
     6 #修改year节点的值
     7 for node in root.iter("year"):
     8     new_year = int(node.text) + 1   #修改节点值
     9     node.text = str(new_year)    #修改后强制转换成字符串类型
    10     node.tag = "newyear"            #修改节点名
    11     node.set("duoduo",'2018')   #修改节点属性
    12  
    13 tree.write("xmltest1.xml")   #修改完成后,重新写入xml文件(可以是任何文件,包括原来的)

    重点:

      可以修改xml文件中的任何内容,包括本身的节点名,修改后一定要有写入xml文件的操作。

    3、删除xml文档内容

     1 import xml.etree.ElementTree as et
     2  
     3 tree = et.parse("xmltest.xml")
     4 root = tree.getroot()
     5  
     6 #删除
     7 for country in root.findall("country"):  #找到第一层子节点(“具体对象”)
     8     rank = int(country.find("rank").text)   #找到子节点下的(“rank”)节点的节点值
     9     if rank > 50:
    10         root.remove(country)    #删除子节点
    11  
    12 tree.write("xmltest1.xml")    #重新写入xml文件

    重点:

      1、root.findall()从根节点只能根据第一层的子节点名查找,并且返回第一层子节点的内存地址,前面root定义什么区域,就查找什么区域

      2、删除子节点用remove()方法

      3、删除以后,一定要做重新写入新的xml文件操作

    4、创建新的xml文件

     1 import xml.etree.ElementTree as et
     2  
     3 new_xml = et.Element("namelist")   #创建根节点
     4  
     5 #创建第一层子节点,后面参数依次是:父节点,子节点,子节点属性
     6 name = et.SubElement(new_xml,"name",attrib={"duoduo":"handsome"})
     7 #创建第二层子节点
     8 age = et.SubElement(name,"age",attrib={"check":"yes"})
     9 #设置第二层节点值
    10 age.text = '22'
    11 sex = et.SubElement(name,"sex")
    12 sex.text = "man"
    13 #创建另外一个第一层子节点
    14 name2 = et.SubElement(new_xml,"name",attrib={"qianduoduo":"haoshuai"})
    15 #创建其第二层子节点
    16 age = et.SubElement(name2,"age")
    17 age.text = '19'
    18  
    19 ET = et.ElementTree(new_xml)  #生成新的xml文档
    20 ET.write("test.xml",encoding="utf-8",xml_declaration=True)  #在新xml文件的开头自动添加:<?xml version='1.0' encoding='utf-8'?>
    21  
    22 et.dump(new_xml)  #在屏幕上打印生成的格式

    重点:pycharm创建的xml直接就是一行,没有格式.

      

  • 相关阅读:
    nginx简单配置
    解决 eclipse出现 Address already in use: bind
    JavaScript 正则表达式学习
    RabbitMQ的介绍与spring整合
    RabbitMQ的安装与客户端的简单实用
    java中的break与continue
    书单
    (七)SpringBoot2.0基础篇- application.properties属性文件的解析及获取
    (六)SpringBoot2.0基础篇- MyBatis、Redis整合(JedisCluster集群连接)
    (五)SpringBoot2.0基础篇- Mybatis与插件生成代码
  • 原文地址:https://www.cnblogs.com/ManyQian/p/8343518.html
Copyright © 2011-2022 走看看