python xml模块学习

xml打开方式

# xml有两种打开方式
# 1. 打开文件,读取XML内容
str_xml = open('xman.xml', 'r').read()
print(str_xml)

# 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)    # 读取字符串,将字符串转为Element对象
print(root)

# 2. 直接解析xml文件
tree = ET.parse("xman.xml")  # 直接从xml文件解析封装一个ElementTree对象
print(tree)

# 以上一个是读取字符串,转换为Element对象,另一个是转换为ElementTree对象,这两个对象具体不同,请参考操作xml部分

获取XML标签

# 例如我现在有一个xml文件
<data test="xxx">
    <country name="Liechtenstein">
        <rank updated="yes">2</rank>
        <year>2023</year>
        <gdppc>141100</gdppc>
        <neighbor direction="E" name="Austria" />
        <neighbor direction="W" name="Switzerland" />
    </country>
    <country name="Singapore">
        <rank updated="yes">5</rank>
        <year>2026</year>
        <gdppc>59900</gdppc>
        <neighbor direction="N" name="Malaysia" />
    </country>
    <country name="Panama">
        <rank updated="yes">69</rank>
        <year>2026</year>
        <gdppc>13600</gdppc>
        <neighbor direction="W" name="Costa Rica" />
        <neighbor direction="E" name="Colombia" />
    </country>
</data>
# 获取xml文件的根节点
root1 = tree.getroot()  # 获取根节点,同样这里root1为Element对象
print(root1)

# 获取标签名
s = root.tag  
print(s)

==> data # 仅仅只会获取最顶层的标签名

# 所以,我们可以迭代获取子标签名
# 这里清楚概念,root是一个Element对象,它迭代的每一个都是Element对象
# 是可以使用同样的tag等方法的
for i in root:  # 可迭代的方式获取子标签名
    print(i.tag) # 获取下一级的标签名

==>
country
country
country

# 获取标签属性
s = root.attrib  # 获取标签属性
print(s)

==>
{'test': 'xxx'}

for i in root:  # 可迭代的方式获取子标签名
    print(i.attrib)  # 获取下一级的标签属性

==>
{'name': 'Liechtenstein'}
{'name': 'Singapore'}
{'name': 'Panama'}


# 获取标签内容
s = root.text  # 获取标签内容
print(s) 

==>  # 空,一级标签下包含的其它标签不算是内容


for i in root:  # 可迭代的方式获取子标签名
    for j in i:
        print(j.text)  # 获取下一级的标签内容

操作XML并写入文件

# 开头我们说了,有两种打开方式打开xml这里我们就分别用两种方式,再次演示,具体Element与ElementTree对象不同

############ 解析方式一 ############
# 读取字符串

# 打开文件,读取XML内容
str_xml = open('xman.xml', 'r').read()

# 将字符串解析成xml特殊对象,root代指xml文件的根节点
root = ET.XML(str_xml)   # 读入字符串

############ 操作 ############

# 顶级标签
print(root.tag)

# 循环所有的year节点
# iter方法:在当前节点的子孙中,根据节点名称寻找所有指定的节点,并返回一个迭代器(可以被for循环)
for node in root.iter('year'):
    # 将year节点中的内容自增1
    new_year = int(node.text) + 1
    node.text = str(new_year)

    # 设置属性(没有添加,有修改)
    node.set('name', 'alex')
    node.set('age', '18')

    # 删除属性
    del node.attrib['name']  # 删除name属性

############ 保存文件 ############
tree = ET.ElementTree(root)
tree.write("xml_t2.xml", encoding='utf-8')
############ 解析方式二 ############

# 直接解析xml文件
tree = ET.parse("xman.xml")

# 获取xml文件的根节点
root = tree.getroot()   # 这里会生成一个ElementTree对象

############ 操作 ############

# 顶层标签
print(root.tag)

# 循环所有的year节点
for node in root.iter('year'):
    # 将year节点中的内容自增一
    new_year = int(node.text) + 1
    node.text = str(new_year)

    # 设置属性
    node.set('name', 'alex')
    node.set('age', '18')
    # 删除属性
    del node.attrib['name']


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

创建XML文件

# 创建xml文档

# 创建根节点
root = ET.Element('famliy')

# 创建节点大儿子 #
son1 = ET.Element('son', {'name':'儿1'})
# son1 = root.makeelement('son', {'name': '儿1'})  # 方法二
# son1 = ET.SubElement(root, "son", attrib={'name': '儿1'})  # 方法三

# 创建节点小儿子 #
son2 = ET.Element('son', {'name':'儿2'})
# son2 = root.makeelement('son', {"name": '儿2'})  # 方法二
# son2 = ET.SubElement(root, "son", attrib={"name": "儿2"})   # 方法三

# 在大儿子中创建两个孙子 #
grandson1 = ET.Element('grandson', {'name': '儿11'})
# grandson1 = son1.makeelement('grandson', {'name': '儿11'})  # 方法二
grandson2 = ET.Element('grandson', {'name': '儿12'})
# grandson2 = son1.makeelement('grandson', {'name': '儿12'})  # 方法二

# 方法三
# grandson1 = ET.SubElement(son1, "age", attrib={'name': '儿11'})
# grandson1.text = '孙子'   # 可以操作标签内容



# 将以上穿件孙子添加到儿子
son1.append(grandson1)
son2.append(grandson2)

# 把儿子添加到根节点中
root.append(son1)
root.append(son2)

# 生成写入一个xml
tree = ET.ElementTree(root)
tree.write('xml_t3.xml',encoding='utf-8',xml_declaration=True ,short_empty_elements=False)
# xml_declaration 设置为<?xml version='1.0' encoding='utf-8'?> xml注释
# short_empty_elements 自闭和的一个参数,如果便签没有text,则 自闭和 没有</xxx>

 

posted @ 2016-06-23 22:31  Cool_King  阅读(1252)  评论(0编辑  收藏  举报