17.xml模块

文章目录

        • 描述
        • xml元素与标签
        • 操作XML
        • reference

描述

XML处理模块。XML(可扩展性标记语言)是一种常见的文件类型,主要用于存储、传输数据和配置文件

xml元素与标签


      2
      2008
      141100
      


1. 标签 :代码中 country、rank、neighbor均为标签,标签内可以没有属性、数据等,但是必须跟上结束标签如:
2. 属性: ,属性是元素的一部分,它必须出现在元素的开始标签中,一个标签中只能出现0或者N个属性,但是不能出现多个同名属性。
3. 数据 :2008,2008即是XML中存储的数据(文本)

操作XML

'''a.xml'''



    
        2
        2008
        141100
        
        
    
    
        5
        2011
        59900
        
    
    
        69
        2011
        13600
        
        
    


读取xml

ElementTree获取的是整个xml的树型结构,可以用树的形式来加载一个已有的xml文件。

from xml.etree import ElementTree as ET

xml = ElementTree.parse('a.xml')   # 打开xml文档,获取ElementTree
root = xml.getroot()  # 获取根节点,一个标准格式的XML有且只有一个根节点

获取根节点的tag、attrib、text

# 2、获取根节点的tag、attrib、text
print(root.tag)  #data
print(root.attrib) #{} 如果属性为空的话,返回一个空的dict
print(root.text)  # '\n ' data标签无文本,只有换行,则打印空白

遍历获得到子节点(元素)

# 3、遍历获得到子元素
for child in root:
    print(child.tag,child.attrib,child.text)
'''打印内容:
country {'name': 'Liechtenstein'} 
        
country {'name': 'Singapore'} 
        
country {'name': 'Panama'} 

三个子元素都没有text,只有换行,则打印出现换行效果
'''

ElementTree提取标签中的属性值

# 4、ElementTree获得属性值
for child in root:
    print(child.tag,child.attrib['name'])

'''打印内容:
country Liechtenstein
country Singapore
country Panama
'''

根据索引查找节点

# 5、根据索引查找子元素
print(root[0][0].text)  # 2 中的2
print(root[1][2].tag)   # 13600中的tag
print(root[3][1])       # 报错 IndexError: child index out of range

查找节点的三种方法(find、findall、iter)

# 6\1、 root.find方法 根据tag查找直接子元素,返回查到的第一个元素
print(root.find('country').attrib)
# >>> {'name': 'Liechtenstein'}

# 6\2、2root.findall() 根据tag查找直接子元素,返回查到的所有元素的列表

for country in root.findall('country'):
    print(country.attrib)
'''
{'name': 'Liechtenstein'}
{'name': 'Singapore'}
{'name': 'Panama'}
'''
#6\3、root.iter()   根据tag查找直接子元素,返回查到的所有元素的生成器
print(root.iter('country'))  # <_elementtree._element_iterator object at 0x000001D592F7C3B0>
for i in root.iter('country'):
    print(i.tag)  # country\country\country

XPath路径表达式查找

更多XPath的用法,参考: https://www.w3school.com.cn/xpath/index.asp

# XPath语句(XML Path)路径查找
'''
/   从根节点选取。
//  从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.   选取当前节点。
..  选取当前节点的父节点。
@   选取属性。

'''
# 返回的值均是生成器
print(root.findall('.//rank'))  # 查找任意层次元素
print(root.findall('country/*'))  # 查找孙子节点元素
print(root.findall('.//rank/..'))   # 选取当前节点
print(root.findall('country[@name]'))   # 包含name属性的country
print(root.findall('country[@name="Singapore"]'))  # name属性为Singapore的country
print(root.findall('country[year="2008"]'))  # 子元素中包含year且year元素的text为2008的country
print(root.findall('country[1]'))      # 第一个country
print(root.findall('country[last()-1]'))  # 倒数第二个country
print(root.findall('country[last()]'))    # 最后一个country

修改节点

# 修改节点内容
head = root.find('country')        # 获取一个节点
head.text = 'YCY2'              # 修改值 数值必须为字符串内容,不然会报错。
head.attrib = {'name':'Head'}   # 修改属性(覆盖原有的属性)
head.set('age','18')            # 添加属性(在原有的基础上添加)

print(head.tag,head.text,head.attrib)  # 本次修改只是在内存中修改,保存文件需要调用ree.write()方法
#>>> country 我是新的text {'name': 'Head', 'age': '18'}

增加节点

# XML增加节点内容

head1 = root.find('country')    # 获取第一个country节点
body = ET.Element('months')     # 创建一个months节点
body.attrib = {"name":"12"}		# 设置属性
body.text = '24day'             # 新增数据
head1.append(body)				# 通过append方法添加节点

tree.write("a.xml",encoding="utf-8")  # 保存到文件

删除节点

### 删除Head节点下的Order节点
tree = ET.parse('a.xml')		# 读取.xml文件
root = tree.getroot()				# 获取根节点,

head = root.find('country')  # 获取节点
root.remove(months)		# 删除节点
tree.write('a.xml') # 保存文件

新建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 = '33'
name2 = ET.SubElement(new_xml, "name", attrib={"enrolled": "no"})
age = ET.SubElement(name2, "age")
age.text = '19'

et = ET.ElementTree(new_xml)  # 生成文档对象
et.write("b.xml", encoding="utf-8", xml_declaration=True)

ET.dump(new_xml)  # 打印生成的格式

reference

https://blog.csdn.net/weixin_42444693/article/details/104524897

你可能感兴趣的:(python千招百式,python,python)