菜鸟学Python第十九天

1.XML模块

  • 什么是XML

    可拓展的标记语言

    标记翻译为标签,用标签来组织数据的语言

    XML 被设计用来传输和存储数据。

  • 相比json,XML使用场景更加广泛,但是语法格式相比json复杂得多

    • 什么时候用json:前后台交互数据时 使用json

    • 是么时候用xml:当需要自定义文档时 使用xml

     

    比如Java中经常用xml来作为配置文件

    作为配置文件,常用操作就是通过程序去读取配置信息

    而修改增加删除,一般是交给用户手动来完成

      • xml文档格式

        • 如下例子

        <person name="jack">hello i am a person</person>

        一个完整的标签分为三个部分

        标签名(tagname):   person

        属性(attribute):       name 值为jack

        文本(text):              hello i am a person

         

        其他格式要求:

        一、任何的起始标签都必须有一个结束标签。

        二、可以采用另一种简化语法,可以在一个标签中同时表示起始和结束标签。这种语法是在大于符号之前紧跟一个斜线(/),例如。XML解析器会将其翻译成。

        三、标签必须按顺序进行嵌套,所以结束标签必须按镜像顺序匹配起始标签,这好比是将起始和结束标签看作是数学中的左右括号:在没有关闭所有的内部括号之前,是不能关闭外面的括号的。

        四、所有的属性都必须有值。

        五、所有的特性都必须在值的周围加上双引号。

        六、最外层必须有且只能有一个标签,称为根标签

         

2.使用XML模块解析

准备数据

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

 

解析XML

import xml.etree.ElementTree as ET
 
tree = ET.parse("xmltest.xml")
root = tree.getroot()
print(root.tag)
 
#遍历xml文档
for child in root:
    print('========>',child.tag,child.attrib,child.attrib['name'])
    for i in child:
        print(i.tag,i.attrib,i.text)
 
#只遍历year 节点
for node in root.iter('year'):
    print(node.tag,node.text)
#---------------------------------------
import xml.etree.ElementTree as ET
 
tree = ET.parse("xmltest.xml")
root = tree.getroot()
 
#修改
for node in root.iter('year'):
    new_year=int(node.text)+1
    node.text=str(new_year)
    node.set('updated','yes')
    node.set('version','1.0')
tree.write('test.xml')
 
 
#删除node
for country in root.findall('country'):
   rank = int(country.find('rank').text)
   if rank > 50:
     root.remove(country)
 
tree.write('output.xml')

 

1.三个用于查找标签函数

iter("标签名") #全文查找
find("标签名") #查找子节点匹配的第一个
findall("标签名") #查找字节点匹配的所有

 

2.访问标签的内容

element.tag 获取标签名
element.attrib 获取属性
element.text 获取文本

 

3.修改文档内容

elment.tag = "标签名"
element.text = "文本"
element.set("属性名","属性值")

 

4.删除节点

root.remove(标签对象)

 

5.添加子标签

#创建标签对象
year2=ET.Element('year2') # 指定名称
year2.text='新年' 
year2.attrib={'update':'yes'}
#添加
country.append(year2) #往country节点下添加子节点

 

删除添加修改后都需要调用write写入到文件

tree.write("文件名"),#注意文档对象才能执行写入操作

 

代码生成XML文档(了解)

import xml.etree.ElementTree as ET
 new_xml = ET.Element("namelist")
name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
age = ET.SubElement(name,"age",attrib={"checked":"no"})
sex = ET.SubElement(name,"sex")
sex.text = 'man'
name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
age = ET.SubElement(name2,"age")
age.text = '19'
et = ET.ElementTree(new_xml) #生成文档对象
et.write("test.xml", encoding="utf-8",xml_declaration=True)
 
ET.dump(new_xml) #打印生成的格式

 

总结,xml的解析比起json而言非常复杂 因为其扩展性远比json高,在java中常作为配置文件,当你在前后台进行数据交互时,优先 是用json格式

疑惑:文本也可以作为属性,属性也可以作为文本,?到底如何选择?, XML不仅仅可以定义数据结构还可以定义数据的显示样式,想想HTML!

 

 

 

猜你喜欢

转载自www.cnblogs.com/liusijun113/p/10104343.html
今日推荐