zoukankan      html  css  js  c++  java
  • python的内置模块xml模块方法 xml解析 详解以及使用

    一、XML介绍

    xml是实现不同语言或程序直接进行数据交换的协议,跟json差不多,单json使用起来更简单,不过现在还有很多传统公司的接口主要还是xml

    xml跟html都属于是标签语言

    我们主要学习的是ElementTree是python的XML处理模块,它提供了一个轻量级的对象模型,在使用ElementTree模块时,需要import xml.etree.ElementTre
    ElementTree相当于整个xml节点树,而Element表示节点数中的一个单独节点
    我们看下下面的xml文本,标签分为2种。
    1、自闭和标签  <rank updated="yes">2</rank>
    2、非闭合标签  <neighbor direction="E" name="Austria" />
    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year updated="yes">2010</year>
            <gdppc>141100</gdppc>
            <neighbor direction="E" name="Austria" />
            <neighbor direction="W" name="Switzerland" />
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year updated="yes">2013</year>
            <gdppc>59900</gdppc>
            <neighbor direction="N" name="Malaysia" />
        </country>
        <country name="Panama">
            <rank updated="yes">69</rank>
            <year updated="yes">2013</year>
            <gdppc>13600</gdppc>
            <neighbor direction="W" name="Costa Rica" />
            <neighbor direction="E" name="Colombia" />
        </country>
    </data> 

    二、xml.etree.ElementTree 模块的具体应用

    1、打印根标签的名字

    import xml.etree.ElementTree as ET #导入模块,名字太长了,把这个模块名重命名为ET
    tree = ET.parse("xml_lesson.xml")#parse解析,用ET模块下的parse这个方法把xml文件解析开,解析开拿到一个tree,tree就是一个对象
    root = tree.getroot()#这个对象可以调用方法,getroot就是根的意思
    print(root.tag)#root这个对象有一个属性tag,tag的值就是根标签的名字
    
    C:python35python3.exe D:/pyproject/day21模块/xml_test
    
    data

    什么是标签,什么是属性,举个例子

    <country name="Liechtenstein">

    conuntry是标签 

    name="Liechtenstein" 是这个标签的属性

    <neighbor direction="W" name="Costa Rica" />

    neighbor是标签

    direction="W" name="Costa Rica"  这2个都是标签的属性

    2、用for循环查看下root下面是什么东西

    for n in root:
        print(n)
    
    C:python35python3.exe D:/pyproject/day21模块/xml_test
    
    <Element 'country' at 0x0000000000E339F8>
    
    <Element 'country' at 0x0000000000E38408>
    
    <Element 'country' at 0x0000000000E38598>

    这3个地址指向的就是对象,打印下这三个标签的名字,用tag这个属性就可以了

    for n in root:
        print(n.tag)
    
    C:python35python3.exe D:/pyproject/day21模块/xml_test
    
    country
    
    country
    
    country

    在打印下country下面的标签

    for n in root:
        for i in n:
            print(i.tag)
    
    C:python35python3.exe D:/pyproject/day21模块/xml_test
    
    rank
    
    year
    
    gdppc
    
    neighbor
    
    neighbor
    
    rank
    
    year
    
    gdppc
    
    neighbor
    
    rank
    
    year
    
    gdppc
    
    neighbor
    
    neighbor

    3、打印标签的属性 attrib

    打印country的属性

    for n in root:
        print(n.attrib)
    
    C:python35python3.exe D:/pyproject/day21模块/xml_test
    
    {'name': 'Liechtenstein'}
    
    {'name': 'Singapore'}
    
    {'name': 'Panama'}

    在打印下country里面的对象的属性

    for n in root:
        for i in n:
            print(i.attrib)
    
    C:python35python3.exe D:/pyproject/day21模块/xml_test
    
    {'updated': 'yes'}
    
    {'updated': 'yes'}
    
    {}
    
    {'name': 'Austria', 'direction': 'E'}
    
    {'name': 'Switzerland', 'direction': 'W'}
    
    {'updated': 'yes'}
    
    {'updated': 'yes'}
    
    {}
    
    {'name': 'Malaysia', 'direction': 'N'}
    
    {'updated': 'yes'}
    
    {'updated': 'yes'}
    
    {}
    
    {'name': 'Costa Rica', 'direction': 'W'}
    
    {'name': 'Colombia', 'direction': 'E'}

    4、text  标签实际包裹的内容

    for n in root:
        for i in n:
            print(i.text)
    
    C:python35python3.exe D:/pyproject/day21模块/xml_test
    
    2
    
    2010
    
    141100
    
    None
    
    None
    
    5
    
    2013
    
    59900
    
    None
    
    69
    
    2013
    
    13600
    
    None
    
    None 

    5、iter  

    想取到每个属性中的year的text值就应该用iter方法这样取

    for n in root.iter("year"):
        print(n.tag,n.text)
    
    C:python35python3.exe D:/pyproject/day21模块/xml_test
    
    year 2010
    
    year 2013
    
    year 2013

    6、对xml文件数据进行修改操作

    import xml.etree.ElementTree as ET #导入模块,名字太长了,把这个模块名重命名为ET
    
    tree = ET.parse("xml_lesson.xml")#parse解析,用ET模块下的parse这个方法把xml文件解析开,
                                       #解析开拿到一个tree,tree就是一个对象
    root = tree.getroot()#这个对象可以调用方法,getroot就是根的意思
    # print(root.tag)#root这个对象有一个属性tag,tag的值就是根标签的名字
    
    for n in root.iter("year"):
        new_year=int(n.text)+1
        n.text=str(new_year)#修改year标签的text属性
        n.set("updated1","yes")#给year这个标签增加一个属性
    tree.write("xml_lesson.xml")#直接把修改的写入到文件中
    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year updated="yes" updated1="yes">2012</year>
            <gdppc>141100</gdppc>
            <neighbor direction="E" name="Austria" />
            <neighbor direction="W" name="Switzerland" />
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year updated="yes" updated1="yes">2015</year>
            <gdppc>59900</gdppc>
            <neighbor direction="N" name="Malaysia" />
        </country>
        <country name="Panama">
            <rank updated="yes">69</rank>
            <year updated="yes" updated1="yes">2015</year>
            <gdppc>13600</gdppc>
            <neighbor direction="W" name="Costa Rica" />
            <neighbor direction="E" name="Colombia" />
        </country>
    </data>

    7、对xml文件进行删除操作,比如删除排名大于50的国家,需要取到每个conutry中的rank的text

    import xml.etree.ElementTree as ET #导入模块,名字太长了,把这个模块名重命名为ET
    
    tree = ET.parse("xml_lesson.xml")#parse解析,用ET模块下的parse这个方法把xml文件解析开,
                                       #解析开拿到一个tree,tree就是一个对象
    root = tree.getroot()#这个对象可以调用方法,getroot就是根的意思
    # print(root.tag)#root这个对象有一个属性tag,tag的值就是根标签的名字
    
    for n in root.findall("country"):#找到所有的country
        rank=int(n.find("rank").text)#找到所有的rank的text值
        if rank > 50:#判断值大于50的
            root.remove(n)#就删除country这个标签
    tree.write("xml_lesson.xml")#写入文件

    删除之后,文件里面只有2个country了

    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year updated="yes" updated1="yes">2012</year>
            <gdppc>141100</gdppc>
            <neighbor direction="E" name="Austria" />
            <neighbor direction="W" name="Switzerland" />
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year updated="yes" updated1="yes">2015</year>
            <gdppc>59900</gdppc>
            <neighbor direction="N" name="Malaysia" />
        </country>
        </data>

    8、如何通过模块创建xml文件呢

    import xml.etree.ElementTree as ET #导入模块,名字太长了,把这个模块名重命名为ET
    new_xml=ET.Element("namelist")#创建了一个根节点
    #相当于创建了<namelist></namelist>
    name=ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
    #创建一个子标签name,然后增加一个属性
    age=ET.SubElement(name,"age",attrib={"checked":"no"})
    sex=ET.SubElement(name,"sex")
    sex.text="28"
    
    
    et=ET.ElementTree(new_xml)#生成文档对象
    et.write("test.xml",encoding="utf8",xml_declaration=True)

    查看下生成的text.xml这个文件内容

    <namelist>
    
    <name enrolled="yes">
    
    <age checked="no"/>
    
    <sex>28</sex>
    
    </name>
    
    </namelist> 
  • 相关阅读:
    用Delphi创建windows服务程序
    如何把程序手工添加系统服务
    http://www.ebooksearchengine.com/albpmpapiebookall.html
    C语言函数二维数组传递方法
    计算程序运行时间(C语言)
    快排序(递归算法)
    厄拉多塞筛(C语言)
    C语言中实现数组的动态增长
    [转]四种流行的Javascript框架jQuery,Mootools,Dojo,ExtJS的对比
    [存档]使用.Net开发web程序时现在比较流行的前台技术都有什么?
  • 原文地址:https://www.cnblogs.com/gouguoqilinux/p/9168332.html
Copyright © 2011-2022 走看看